题目:

求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
*/

 

posted on 2019-08-28 20:19  rua-rua-rua  阅读(278)  评论(0编辑  收藏  举报