Descriptioin
Solution
不太会做的一类题。首先说一个结论,一个数字一定能表示成 p1a1∗p2a2∗p3a3... ,其中p都是素数,a1是不为0的正整数。那么所有因数的和就可以表示成 (p10+p11+p12+....p1a1)∗(p20+p21+p22+....)∗...
这里等比数列是很好求的,分数取模用乘法逆元+快速幂,对于b次方我们把每个a乘上b去做就好了
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int MOD=9901;
typedef long long LL;
LL a,b;
int ksm(int x,LL y)
{
int ans=1;
while (y)
{
if (y&1) (ans*=x)%=MOD;
(x*=x)%=MOD;y>>=1;
}
return ans;
}
int main()
{
scanf("%lld%lld",&a,&b);
int ans=1;LL tmp=a;
for (int i=2;(LL)i*i<=a;i++)
if (tmp%i==0)
{
int s=0;
while (tmp%i==0) tmp/=i,s++;
(ans*=(ksm(i%MOD,(LL)s*b+1)-1)*ksm((i-1)%MOD,MOD-2)%MOD)%=MOD;
}
if (tmp>1) (ans*=(ksm(tmp%MOD,b+1)-1)*ksm((tmp-1)%MOD,MOD-2)%MOD)%=MOD;
cout<<ans<<endl;
return 0;
}