Pagini recente » Cod sursa (job #1339848) | Cod sursa (job #20638) | Cod sursa (job #3222339) | Cod sursa (job #325162) | Cod sursa (job #2666313)
#include <stdio.h>
#define NRDIVDIFF 8
#define MOD 9901
int divizori[NRDIVDIFF], exponent[NRDIVDIFF];
void descompunere( int n, int *nrdiv ) {
int d = 2, exp, x;
while ( n >= d * d ) {
exp = 0;
while ( n % d == 0 ) {
exp++;
n /= d;
}
if ( exp > 0 ) {
divizori[*nrdiv] = d;
exponent[*nrdiv] = exp;
x = *nrdiv;
*nrdiv = x + 1;
}
d++;
}
if ( n > 1 ) {
divizori[*nrdiv] = n;
exponent[*nrdiv] = 1;
x = *nrdiv;
*nrdiv = x + 1;
}
}
int lgput( int a, int b ) {
int put = 1;
while ( b > 0 ) {
if ( b % 2 == 1 )
put = (long long)put * a % MOD;
a = (long long)a * a % MOD;
b /= 2;
}
return put;
}
void euclid( int a, int b, int *d, int *x, int *y ) {
int x0, y0;
if ( b == 0 ) {
*d = a;
*x = 1;
*y = 0;
} else {
euclid( b, a % b, d, &x0, &y0 );
*x = y0;
*y = x0 - (a / b) * y0;
}
}
int main()
{
FILE *fin, *fout;
int a, b, s, nrdiv, i, put, invs, x, y, d;
fin = fopen( "sumdiv.in", "r" );
fout = fopen( "sumdiv.out", "w" );
fscanf( fin, "%d%d", &a, &b );
fclose( fin );
nrdiv = 0;
descompunere( a, &nrdiv );
s = 0;
for ( i = 0; i < nrdiv; i++ ) {
put = lgput( divizori[i], exponent[i] * b + 1 );/// pk^(ek + 1)
put -= 1;
invs = divizori[i] - 1;
euclid( invs, MOD, &d, &x, &y );
x %= MOD;
put = (long long)put * x % MOD;
s = ((long long)s + put) % MOD;
}
fprintf( fout, "%d", s );
fclose( fout );
return 0;
}