对 A进行质因子分解
所以
所以约数之和为
容易想到等比数列的前n项和公式,但这个公式里有要除以
那么容易想到用逆元,但质数9901太小了,无法保证互质
所以只能换种办法求等比数列的前
项和;
问题化为怎么求
的前
项和:
当n为奇数时
当n为偶数时
所以递归求即可
代码:
#include<iostream>
#include<cstring>
#define ll long long
#define endl '\n'
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int MX=4e2+7;
const int mod=9901;
using namespace std;
int p[MX],k[MX];
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}
ll __gcm(ll a,ll b){return a*b/__gcd(a,b);}
ll __get(ll a,ll b)
{
ll ans=1;
if(b==0)return 1;
if(b==1)return a+1;
if(b&1)
ans=ans*__get(a,b/2)%mod*(1+qpow(a,b/2+1));
else {
ans=ans*__get(a,b/2-1)*(1+qpow(a,b/2+1))%mod+qpow(a,b/2);
ans%=mod;
}
return ans;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
ll a,b;
while(cin>>a>>b){
memset(k,0,sizeof k);
int top=0;
for(int i=2;i*i<=a;i++)
{
if(a%i==0)
{
p[++top]=i;
while(a%i==0)
{
a/=i;
k[top]++;
}
}
}
if(a>1){
p[++top]=a;
k[top]=1;
}
ll ans=1;
rep(i,1,top) ans=ans*__get(p[i],b*k[i])%mod;
cout<<ans<<endl;
}
}