题意即求A得B次方的所有约数之和mod9901
很重要的一点是9901是质数…
因为9901是质数,所以乘法逆元就是分母的mod-2,也就是9899次方,用快速幂可求。
代码中要注意longlong的问题…很容易爆
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a,b,cnt,ans=1,mod=9901;
int p[100],c[100];
void divide(int n)//分解质因数
{
cnt=0;
for(int i=2;i*i<=n;i++){
if(n%i==0)
p[++cnt]=i;
while(n%i==0)
c[cnt]++,n/=i;
}
if(n>1)
p[++cnt]=n,c[cnt]=1;
}
int fastmul(int a,long long b)//快速幂
{
int res=1;
while(b){
if(b&1){
res=(long long)res*a%mod;
}
b>>=1;
a=(long long)a*a%mod;
}
return res;
}
int main()
{
cin>>a>>b;
divide(a);
for(int i=1;i<=cnt;i++){
if((p[i]-1)%mod==0){//乘法逆元不存在的情况
ans=(((long long)b*c[i]+1)%mod*ans)%mod;continue;
}
int x=fastmul(p[i],(long long)b*c[i]+1);//存在的情况
x=(x-1+mod)%mod;
int y=p[i]-1;
y=fastmul(y,mod-2);
ans=(long long)x*y%mod*ans%mod;
}
cout<<ans<<endl;
return 0;
}