Pagini recente » Cod sursa (job #2078989) | Cod sursa (job #1050223) | Cod sursa (job #498959) | Cod sursa (job #2117746) | Cod sursa (job #756239)
Cod sursa(job #756239)
# include <cstdio>
const char FIN[] = "sumdiv.in", FOU[] = "sumdiv.out";
const int MOD = 9901, MAX = 10005;
int P[MAX];
int A, B, S = 1;
unsigned char V[1 << 17];
void prec ()
{
int n = 0;
P[++n] = 2;
for (int i = 3; i < MAX; i += 2)
{
if (V[i >> 4] & (1 << ((i >> 1) & 7))) continue; // = daca (V[i] == 1)
P[++n] = i; // introducem pe i ca numar prim
for (int j = i + (i << 1); j < MAX; j += i << 1)
V[j >> 4] |= 1 << ((j >> 1) & 7); // V[j] = 1;
}
}
inline int pwlg ( int n , int p )
{
int sol = 1;
n %= MOD ;
for ( int i = 0; 1 << i <= p; ++i )
{
if ( 1 << i & p )
sol *= n, sol %= MOD;
n *= n , n %= MOD;
}
return sol;
}
inline int check ( int n , int p )
{
if ( n % MOD == 1 )
return p * B + 1;
return ( pwlg ( n , (long long) p * B + 1 ) + MOD - 1 ) * ( pwlg ( n - 1 , MOD - 2 ) ) % MOD;
}
int main()
{
freopen ( FIN, "r", stdin ) ;
freopen ( FOU, "w", stdout ) ;
scanf ( "%d %d", &A, &B ) ;
int AUX = A;
prec () ;
for ( int i = 1, p = 0; P[i] * P[i] <= A ; ++i)
if ( A % P[i] == 0 )
{
for ( p = 0 ; AUX % P[i] == 0 ; AUX /= P[i], ++p ) ;
if ( p )
S *= check ( P[i] , p ) , S %= MOD ;
}
if ( AUX > 1 )
S *= check ( AUX , 1 ) , S %= MOD ;
printf ( "%d", S ) ;
return 0;
}