Pagini recente » Cod sursa (job #2513441) | Borderou de evaluare (job #2510100) | Cod sursa (job #3187285) | Cod sursa (job #1012009) | Cod sursa (job #1705455)
#define MLC
#include <bits/stdc++.h>
using namespace std;
typedef long long i64;
const i64 MOD = 9901;
bitset<10005> c;
vector<i64> p;
vector<pair<i64 , i64> > fkt;
void erat(i64 lim) {
c[0] = 1;
c[1] = 1;
for(i64 i=4; i<=lim; ++i, ++i)
c[i] = 1;
for(i64 i=3; i<=lim; ++i, ++i) {
if(c[i])
continue;
for(i64 j=1LL*i*i; j<=lim; j+=i+i)
c[j] = 1;
}
for(i64 i=1; i<=lim; ++i)
if(!c[i])
p.push_back(i);
}
i64 expow(i64 b, i64 e) {
i64 ans = 1;
while(e) {
if(e&1)
ans=1LL*ans*b%MOD;
b=1LL*b*b%MOD;
e>>=1;
}
return ans;
}
i64 mod(i64 a, i64 b) {
return (a%b<0)?(b+a%b):(a%b);
}
void fact(i64 arg) {
i64 c, d;
for(i64 i=0; p[i]*p[i]<=arg; ++i) {
if(arg%p[i])
continue;
c=0;
while(arg%p[i]==0) {
arg/=p[i];
++c;
}
fkt.push_back(make_pair(p[i], c));
}
if(arg>1)
fkt.push_back(make_pair(arg, 1));
}
int main(void) {
FILE *fi = fopen("sumdiv.in", "r");
FILE *fo = fopen("sumdiv.out", "w");
i64 a, b, nu, nd;
erat(10000);
nu = 1;
nd = 1;
fscanf(fi,"%lld%lld",&a,&b);
fact(a);
for(auto &i:fkt)
i.second*=b;
for(auto &i:fkt) {
nu = mod(nu * mod((expow(i.first, i.second+1)-1), MOD), MOD);
nd = mod(nd * mod((i.first-1), MOD), MOD);
}
fprintf(fo,"%lld\n",mod(nu*expow(nd, MOD-2), MOD));
fclose(fi);
fclose(fo);
return 0;
}