Pagini recente » Cod sursa (job #921848) | Cod sursa (job #1714776) | Cod sursa (job #1944906) | Cod sursa (job #1639963) | Cod sursa (job #185857)
Cod sursa(job #185857)
/*
* avem de calculat suma div lu A^B, care de fapt este un nr X
* X se poate factoriza in (p1^e1)*(p2^e2)*(p3^e3)...
* se cere suma( (p1^a1)*(p2^a2)*(p3^a3)... ), cu 0<=ai<=ei
* se poate demonstra prin ind, matematica :
* sum = (1+p1+p1^2+...+p1^e1)*(1+p2+p2^2+..+p2^e2)*...
*
* vom avea la un moment dat rapoarte de genul (p1^(e1+1)-1)/(p1-1)
* modular e ceva de genu x/y = z => z*y = x => z = invers_modular(y)*x
*/
#include <cstdio>
#define iofile \
freopen("sumdiv.in", "r", stdin);\
freopen("sumdiv.out", "w", stdout);
#define MAX_N 10000
#define MOD 9901
int p[MAX_N*4], e[MAX_N*4];
int A,B, n,x,y,z,i,r;
int putere(int a, int b) {
int i, p=a, r=1;
for ( i=0; (1<<i)<=b; ++i, p=(p*p)%MOD )
if ( b & (1<<i) )
r = (r*p)%MOD;
return r;
}
int invers(int a) {
return putere(a, MOD-2);
}
int main() {
iofile;
scanf("%d %d", &A, &B);
if ( A==1 ) {
printf("1\n");
return 0;
}
// factorize
x = A; n=0;
for ( i=2; i*i<=A && x>1; ++i ) {
for ( p[n]=i, e[n]=0; x%i==0; x /= i, e[n]++);
e[n] *= B;
++n;
}
if ( x>1 )
p[n] = x, e[n++] = B;
// calcul
for ( r=1, i=0; i<n; ++i ) {
x = putere(p[i], e[i]+1)-1;
x += x<0 ? MOD : 0;
y = (p[i]-1) % MOD;
z = (invers(y) * x) % MOD;
r = (r*z) % MOD;
}
printf("%d\n", r);
return 0;
}