Pagini recente » Cod sursa (job #1577027) | Cod sursa (job #2665271) | Cod sursa (job #407571) | Cod sursa (job #2608728) | Cod sursa (job #1477368)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
const int MOD = 9901;
int a, b, p, nr;
int lg_power(int x){
if(x == 0) return 1;
int v = lg_power(x / 2);
v = (1LL * v * v) % MOD;
if(x % 2) v = (1LL * v * p) % MOD;
return v;
}
int gcd(int a, int b, int &x, int &y){
if(b == 0){
x = 1;
y = 0;
return a;
}
int d, xp, yp;
d = gcd(b, a % b, xp, yp);
x = yp;
y = xp - yp * (a / b);
return d;
}
int solve(){
int k = 0, x, inv, y, ans = 1, z;
while(a % 2 == 0){
a /= 2;
k++;
}
if(k > 0){
p = 2;
x = lg_power(k * b + 1) - 1;
if(x <= 0) x += MOD;
y = gcd(1, MOD, inv, y);
if(inv <= 0) inv += MOD;
ans = 1LL * ans * x * inv % MOD;
}
for(int i = 3; i * i <= nr; i += 2){
if(a % i == 0){
k = 0;
while(a % i == 0){
a /= i;
k++;
}
p = i;
x = lg_power(k * b + 1) - 1;
if(x <= 0) x += MOD;
y = gcd((i - 1) % MOD, MOD, inv, y);
if(inv <= 0) inv += MOD;
ans = 1LL * ans * x * inv % MOD;
}
}
if(a != 1){
p = a;
x = lg_power(b + 1) - 1;
if(x <= 0) x += MOD;
y = gcd((a - 1) % MOD, MOD, inv, y);
if(inv <= 0) inv += MOD;
if(x != MOD || inv != MOD){
ans = (1LL * ans * x * inv) % MOD;
} else {
ans = (1LL * ans * (b + 1)) % MOD;
}
}
return ans;
}
int main(){
int x, inv, y;
fin >> a >> b;
nr = a;
if(a == 0 || b == 0 || a == 1){
fout << 1;
} else {
fout << solve();
}
return 0;
}