题目:
求A^B所有约数和(A,B<=5e7)
#include<bits/stdc++.h> using namespace std; #define ll long long #define N 40 #define mod 9901 ll num[N],p[N]; int cnt=0; ll quick_pow(ll a,ll k) { ll ans=1; while(k){ if(k&1) ans=ans*a %mod; a=a*a %mod; k>>=1; } return ans; } void devide(ll a) { for(int i=2;i*i<=a;i++)//根号n地分解质因数 if(a%i==0){ p[++cnt]=i; while(a%i==0) a/=i,num[cnt]++; } if(a>1) p[++cnt]=a,num[cnt]++;//防止a是质数 } int main() { ll a,b,ans=1; scanf("%lld%lld",&a,&b); devide(a);//printf("cnt:%d\n",cnt); for(int i=1;i<=cnt;i++){ if( (p[i]-1) %mod==0 ) ans=ans*(num[i]+1) %mod;//额外讨论p[i]-1整除mod的情况 这时候它没有逆元 //p[i]-1 (=) mod 则 p[i] (=) 1 (%mod) 原式就转换成了b*num[i]+1个1相加 else{ ll x=quick_pow(p[i],num[i]*b+1), inv=quick_pow(p[i]-1,mod-2) ; ans=ans*(x-1) %mod *inv %mod; } } printf("%lld\n",ans); } /* 10000000 10000000 */