Pagini recente » Cod sursa (job #445938) | Cod sursa (job #586880) | Cod sursa (job #1196263) | Cod sursa (job #2597253) | Cod sursa (job #1062058)
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
#define modulo 9901
ll b[200],e[200];
int counter;
void primeFactors(ll n){
if(n % 2 == 0){
b[counter] = 2;
n >>= 1;
++e[counter];
while(n % 2 == 0)
++e[counter],n >>= 1;
counter++;
}
ll p = 3;
int exp = 0;
while(p * p <= n){
if(n % p == 0){
b[counter] = p;
while(n % p == 0)
n /= p,++e[counter];
counter++;
}
p += 2;
}
if (n > 1)
b[counter] = n,e[counter++] = 1;
}
ll pow(ll a,ll b){
ll res = 1;
while (b)
{
if (b % 2)
res = (res * a) % modulo;
a = (a * a) % modulo;
b >>= 1;
}
return res;
}
ll findInverse(ll a)
{
ll x[3];
ll y[3];
ll b = modulo;
ll quotient = a / b;
ll remainder = a % b;
x[0] = 0;
y[0] = 1;
x[1] = 1;
y[1] = quotient * -1;
ll i = 2;
for (; (b % (a % b)) != 0; i++)
{
a = b;
b = remainder;
quotient = a / b;
remainder = a % b;
x[i % 3] = (modulo + (quotient * -1 * x[(i - 1) % 3]) + x[(i - 2) % 3]) % modulo;
y[i % 3] = (modulo + (quotient * -1 * y[(i - 1) % 3]) + y[(i - 2) % 3]) % modulo;
}
return x[(i - 1) % 3];
}
ll calc(ll A,ll B){
ll sum = 1;
int i;
primeFactors(A);
for(i = 0; i < counter; i++)
sum *= ((pow(b[i],(e[i] * B + 1)) + modulo - 1) % modulo) * ((findInverse(b[i] - 1) % modulo)),sum %= modulo;
return sum;
}
int main(){
freopen("sumdiv.in","r",stdin);
freopen("sumdiv.out","w",stdout);
ll A,B;
scanf("%lld %lld", &A, &B);
printf("%lld",calc(A,B));
return 0;
}