Pagini recente » Cod sursa (job #2756654) | Cod sursa (job #244097) | Cod sursa (job #1142208) | Cod sursa (job #510246) | Cod sursa (job #2663869)
//Mihai Priboi
#include <stdio.h>
#include <stdlib.h>
#define MOD 9901
#define RAD_A 7080 // 7079 cel mai mic numar prim mai mare decat radical de max a
int r, x, y;
int ciur[RAD_A], nrprime[RAD_A];
void euclid( int a, int b, int *r, int *x, int *y ) {
int x0, y0;
if( b == 0 ) {
*r = a;
*x = 1;
*y = 0;
}
else {
euclid( b, a % b, r, &x0, &y0 );
*x = y0;
*y = x0 - (a / b) * y0;
}
}
long long pow( long long n, long long p ) {
long long r;
r = 1;
while( p > 0 ) {
if( p % 2 == 1 )
r = (r * n) % MOD;
n = (n * n) % MOD;
p /= 2;
}
return r;
}
int main() {
FILE *fin, *fout;
int a, b, d, p, m, n, rez, d1, x1, y1, i;
// precalculare nr prime
for( d = 2; d < RAD_A; d++ )
if( !ciur[d] )
for( i = d * d; i < RAD_A; i += d )
ciur[i] = 1;
//
i = 0;
d = 0;
for( d = 2; d < RAD_A; d++ )
if( !ciur[d] )
nrprime[i++] = d;
//
fin = fopen( "sumdiv.in", "r" );
fscanf( fin, "%d%d", &a, &b );
fclose( fin );
d = 0;
n = m = 1;
while( nrprime[d] * nrprime[d] <= a ) {
p = 0;
while( a % nrprime[d] == 0 ) {
a /= nrprime[d];
p++;
}
if( p > 0 ) {
p *= b;
n = (n * (pow(nrprime[d], p + 1) - 1)) % MOD;
m = (m * (nrprime[d] - 1)) % MOD;
}
d++;
}
if( a > 1 ) {
p = b;
n = (n * (pow(a, p + 1) - 1)) % MOD;
m = (m * (a - 1)) % MOD;
}
euclid(m, MOD, &d1, &x1, &y1);
if( x1 <= 0 )
x1 = MOD + x1 % MOD;
rez = (n * (x1 % MOD)) % MOD;
fout = fopen( "sumdiv.out", "w" );
fprintf( fout, "%d", rez );
fclose( fout );
return 0;
}