Pagini recente » Cod sursa (job #1592345) | Cod sursa (job #501942) | Cod sursa (job #524658) | Cod sursa (job #1430725) | Cod sursa (job #1161063)
#include<stdio.h>
#include<algorithm>
#include<vector>
#define pb push_back
#define MOD 9901
#define lim 7100
using namespace std;
int A,B,sol=1;
int sieve[lim+5];
vector<int> l;
void read()
{
scanf("%d%d",&A,&B);
}
void preproc()
{
for(int i=2;1LL*i*i<=lim;i++)
if(!sieve[i*i])
for(int j=i;1LL*i*j<=lim;j++)
sieve[i*j]=1;
for(int i=2;i<=lim;i++)
if(!sieve[i]) l.pb(i);
}
void gcd(int a,int b,int &x,int &y)
{
if(b==0) {x=1; y=0; return;}
int x0,y0;
gcd(b,a%b,x0,y0);
x=y0;
y=(1LL*x0-1LL*(a/b)*y0)%MOD;
while(y<0) y+=MOD;
}
void update(int f)
{
int nr,p,add;
int x,y;
for(nr=0;A%f==0;A/=f,nr++);
nr*=B; nr++; p=1; add=f%MOD;
for(int j=0;(nr>>j);j++)
{
if( ((nr>>j)&1) ) {p*=add; if(p>=MOD) p-=MOD;}
add*=add; if(add>=MOD) add-=MOD;
}
p--; if(p<0) p+=MOD;
gcd(f-1,MOD,x,y);
while(x<0) x+=MOD; x%=MOD;
p=(p*x)%MOD;
sol*=p; if(sol>=MOD) sol-=MOD;
}
void solve()
{
for(unsigned int i=0;i<l.size() && 1LL*l[i]*l[i]<=A;i++)
if(A%l[i]==0) update(l[i]);
if(A!=1) update(A);
}
int main()
{
freopen("sumdiv.in","r",stdin);
freopen("sumdiv.out","w",stdout);
read();
preproc();
solve();
printf("%d",sol);
fclose(stdin);
fclose(stdout);
return 0;
}