Pagini recente » Cod sursa (job #2307551) | Cod sursa (job #1369911) | Cod sursa (job #1550660) | Cod sursa (job #2760509) | Cod sursa (job #1065711)
#include<cstdio>
#include<vector>
#define NMAX 500000
#define MOD 9901
using namespace std ;
int A, B, N, sum = 1 ;
vector<int> prime(NMAX) ;
vector<long long> nrp(NMAX) ;
void fact(int A) ;
void solve() ;
void write() ;
int risep(int x, long long p) ;
int main() {
int i ;
freopen("sumdiv.in", "r", stdin) ;
freopen("sumdiv.out", "w", stdout) ;
scanf("%d %d", &A, &B) ;
fact(A) ;
for (i = 1; i <= N; ++i) {
nrp[i] *= B ;
}
solve() ;
write() ;
return 0 ;
}
void fact(int A) {
int p ;
N = 0 ;
if (A % 2 == 0) {
++N ;
prime[N] = 2 ;
while(A % 2 == 0) {
A >>= 1 ;
++nrp[N] ;
}
}
for (p = 3; p * p <= A; p += 2) {
if (A % p == 0) {
++N ;
prime[N] = p ;
while(A % p == 0) {
A /= p ;
++nrp[N] ;
}
}
}
if (A > 1) {
++N;
prime[N] = A ;
nrp[N] = 1;
}
}
void solve() {
int i, A, B ;
for (i = 1; i <= N; ++i) {
A = risep(prime[i],nrp[i] + 1) ;
A = A + MOD - 1 ;
A %= MOD ;
B = risep(prime[i] - 1, MOD - 2) ;
sum *= (A * B) % MOD ;
sum %= MOD ;
}
}
void write() {
printf("%d\n", sum) ;
}
int risep(int x, long long p) {
if (p == 1) return x % MOD ;
int result ;
result = risep(x, p / 2) ;
result *= result ;
result %= MOD ;
if ((p & 1) == 1) result *= x % MOD ;
return result % MOD ;
}