A^B的约数和(因子约束和)

5845: A^B的约数和 分享至QQ空间

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/qq-1585047819/p/11368792.html