5845: A^B的约数和
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交: 59 测试通过:14
View Code
总提交: 59 测试通过:14
描述
给定两个正整数A和B(0<=A, B<=5*107),求AB的所有约数之和,因为结果可能很大,你只要将结果对9901取余即可。
输入
两个正整数A和B(0<=A, B<=5*107)
输出
AB 约数之和mod 9901。
样例输入
样例输出
解题思路:
把整数转化为质数相乘先然后计算
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <iomanip> 7 #include <cmath> 8 using namespace std; 9 10 typedef long long ll; 11 const int mod=9901; 12 ll A,B; 13 vector<pair<ll,ll> >vec; 14 15 ll quick_pow(ll n,ll m){ 16 ll sum=1; 17 while(m){ 18 if(m&1) sum=sum*n%mod; 19 m>>=1; 20 n=n*n%mod; 21 } 22 return sum; 23 } 24 25 bool judge(ll n){ 26 if(n==1) return false; 27 for(int i=2;i*i<=n;i++){ 28 if(n%i==0) return false; 29 } 30 return true; 31 } 32 33 int main(){ 34 ios::sync_with_stdio(false); 35 cin>>A>>B; 36 ll num=2; 37 if(judge(A)==true) vec.push_back({A,B+1}); 38 else{ 39 while(1){ 40 ll flag=0,ee=0; 41 while(A%num==0){ 42 A/=num; 43 ee++; 44 flag=1; 45 } 46 if(flag){ 47 vec.push_back({num,ee*B+1}); 48 } 49 num++; 50 if(A==1) break; 51 } 52 } 53 ll sum=1; 54 for(int i=0;i<vec.size();i++){ 55 ll shu1=vec[i].first; 56 ll shu2=vec[i].second; 57 sum=sum*(quick_pow(shu1-1,mod-2)%mod)%mod*(quick_pow(shu1,shu2)-1)%mod; 58 } 59 if(A==0) sum=0; 60 cout << sum%mod << endl; 61 return 0; 62 }