Pagini recente » Cod sursa (job #2424792) | Cod sursa (job #2947179) | Cod sursa (job #2200170) | Cod sursa (job #1188923) | Cod sursa (job #1903057)
#include <cstdio>
#define n 9901
using namespace std;
int a, b;
int putere(int baza, long long int exp)
{
int ans=1;
baza%=n;
for( ;exp;exp>>=1)
{
if(exp%2==1)
ans=(ans*baza)%n;
baza=(baza*baza)%n;
}
if(ans==0)
ans+=n;
return ans;
}
void inv(int a, int b, int &k, int &l)
{
if(b==0)
{
l=1;
k=0;
return;
}
int k1, l1;
inv(b, a%b, k1, l1);
l=k1;
k=l1-(a/b)*k1;
}
int prog(int p, long long int f, int s)
{
int k, l;
inv(p-1, n, k, l);
if(l<=0)
l=n+l%n;
int put=putere(p%n, f+1);
if(put<=0)
put=n+put%n;
return ((s*(put-1)%n)*l)%n;
}
int sdiv()
{
int d, s=1;
long long p;
p=0;
while(a%2==0)
{
p++;
a/=2;
}
if(p)
{
d=2;
p*=b;
if((d-1)%n==0)
s=(s*((p+1)%n))%n;
else
s=prog(d, p, s);
}
d=3;
while((long long)d*d<=a && a>1)
{
p=0;
while(a%d==0)
{
p++;
a/=d;
}
if(p)
{
p*=b;
if((d-1)%n==0)
s=(s*(p+1)%n)%n;
else
s=prog(d, p, s)%n;
}
d+=2;
}
if(a>1)
{
p=b;
d=a;
if((d-1)%n==0)
s=(s*((p+1)%n))%n;
else
s=prog(d, p, s);
}
return s;
}
int main()
{
freopen("sumdiv.in", "r", stdin);
freopen("sumdiv.out", "w", stdout);
scanf("%d %d", &a, &b);
if(a==0)
printf("0");
else
{
int rez=sdiv();
if(rez<=0)
rez=n+rez%n;
printf("%d", rez);
}
return 0;
}