题目链接
分治法递归求解
#include<cstdio>
#include<cmath>
const int mod=9901;
inline int qpow(int a,int mi)
{
int ret=1;
a=a%mod;
while(mi)
{
if(mi&1)ret=ret%mod*a%mod;
mi>>=1;
a=a%mod*a%mod;
}
return ret;
}
inline int sum(int a,int b)
{
if(b==1)return 1;
if(b&1)return (sum(a,b/2)*(1+qpow(a,b/2+1))+qpow(a,b/2))%mod;
return (sum(a,b/2)*(qpow(a,b/2)+1))%mod;
}
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
if(a<=1||b==0)
{
puts("1");continue;
}
int ans=1;
int n=(int)sqrt(a+0.5);
for(int i=2;i<=n;i++)
if(a%i==0)
{
int tmp=0;
while(a%i==0)
{
tmp++;a/=i;
}
ans=ans%mod*sum(i,tmp*b+1)%mod;
}
if(a>1)ans=ans*sum(a,b+1)%mod;
printf("%d\n",(ans+mod)%mod);
}
return 0;
}