Pagini recente » Cod sursa (job #474102) | Cod sursa (job #195090) | Cod sursa (job #1364730) | Cod sursa (job #945142) | Cod sursa (job #2663034)
#include <iostream>
#include <stdio.h>
#define MOD 9901
using namespace std;
int prod;
void rid_put(int x, int put, int mod) {
if (put == 0)
return;
if (put % 2 == 1)
prod = (1ll * prod * x) % mod;
x = (1ll * x * x) % mod;
rid_put(x, put / 2, mod);
}
int phi(int x) {
int d, sol;
sol = x;
for (d = 2; d * d <= x; d++)
if (x % d == 0) {
while (x % d == 0)
x /= d;
sol = sol / d * (d - 1);
}
if (x > 1)
sol = sol / x * (x - 1);
return sol;
}
int inv_mod(int a, int n) {
int nr = phi(n);
prod = 1;
rid_put(a, nr - 1, n);
return prod;
}
int sum_div(int a, int b) {
int d, put, nr1, nr2, sol;
sol = 1;
for (d = 2; d * d <= a; d++) {
put = 0;
while (a % d == 0) {
put++;
a /= d;
}
if (put > 0) {
put *= b;
prod = 1;
rid_put(d % MOD, put + 1, MOD);
nr1 = (prod - 1 + MOD) % MOD;
nr2 = inv_mod((d - 1) % MOD, MOD);
sol = (1ll * sol * nr1) % MOD;
sol = (1ll * sol * nr2) % MOD;
}
}
if (a > 0) {
d = a;
put = b;
prod = 1;
rid_put(d % MOD, put + 1, MOD);
nr1 = (prod - 1 + MOD) % MOD;
nr2 = inv_mod((d - 1) % MOD, MOD);
sol = (1ll * sol * nr1) % MOD;
sol = (1ll * sol * nr2) % MOD;
}
return sol;
}
int main() {
FILE *fin, *fout;
int a, b;
fin = fopen("sumdiv.in", "r");
fscanf(fin, "%d%d", &a, &b);
fclose( fin );
fout = fopen("sumdiv.out", "w");
fprintf(fout, "%d", sum_div(a, b));
fclose( fout );
return 0;
}