Pagini recente » Cod sursa (job #3305316) | Cod sursa (job #3323048) | Cod sursa (job #3327241) | Cod sursa (job #3337946) | Cod sursa (job #3323067)
#include <stdio.h>
#include <stdlib.h>
#define MOD 9901
void euler(int a, int b, int *x, int *y){
if(b == 0){
*x = 1;
*y = 0;
}
else{
int x0, y0;
euler(b, a % b, &x0, &y0);
*x = y0;
*y = x0 - (a / b) * y0;
}
}
int main()
{
FILE *fin, *fout;
fin = fopen("sumdiv.in", "r");
fout = fopen("sumdiv.out", "w");
int a, b, d, e, sum, p, nr, x, y;
fscanf(fin, "%d%d", &a, &b);
sum = 1;
d = 2;
while(d * d <= a){
e = 0;
while(a % d == 0){
a /= d;
e++;
}
// calculam d ^ (e * b + 1) % MOD
e = e * b + 1;
p = 1;
nr = d;
while(e > 0){
if(e % 2 == 1){
p = (1LL * p * nr) % MOD;
}
nr = (1LL * nr * nr) % MOD;
e /= 2;
}
// calculam invMod
euler(d - 1, MOD, &x, &y);
if(x < 0){
x += MOD;
}
p--;
sum = (1LL * sum * p * x) % MOD;
d++;
}
if(a > 1){
// apare a ^ b
e = b + 1;
p = 1;
nr = a;
while(e > 0){
if(e % 2 == 1){
p = (1LL * p * nr) % MOD;
}
nr = (1LL * nr * nr) % MOD;
e /= 2;
}
euler(a - 1, MOD, &x, &y);
if(x < 0){
x += MOD;
}
p--;
sum = (1LL * sum * p * x) % MOD;
}
fprintf(fout, "%d", sum);
fclose(fin);
fclose(fout);
return 0;
}