Pagini recente » Cod sursa (job #3288191) | Cod sursa (job #1248506) | Unirea 2007, Clasament pentru clasele IX-X | Cod sursa (job #99753) | Cod sursa (job #1062330)
#include <iostream>
#include <fstream>
#include <cmath>
#define MAX 50000010
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
const long long MODULUS = 9901;
long long A, B;
long long prim[8000];
long long putere[8000];
int nr_prime=0;
void factorizeaza(long long n) {
long long nr, t;
for (int i=2, sq=sqrt(n); i<=sq; i++) {
nr = 0;
while (n%i==0) {
n /= i;
nr++;
}
if (nr>0) {
prim[nr_prime] = i;
putere[nr_prime] = nr;
nr_prime++;
}
}
if (n>1) {
prim[nr_prime] = n;
putere[nr_prime] = 1;
nr_prime++;
}
}
void ridica_la_putere(int n) {
for (int i=0; i<nr_prime; i++) {
putere[i] *= n;
}
}
long long euclid(long long x, long long y, long long &a, long long &b) {
if (y==0) {
a = 1;
b = 0;
return x;
} else {
long long ap, bp;
long long d = euclid(y, x%y, ap, bp);
a = bp;
b = (MODULUS + ap - ((bp*(x/y))%MODULUS)) % MODULUS;
return d;
}
}
long long pow(long long x, long long p) {
long long rez = 1, t = x;
while (p > 0) {
if (p%2==1) {
rez *= t;
if (rez >= MODULUS) rez %= MODULUS;
}
t *= t;
if (t >= MODULUS) t %= MODULUS;
p /= 2;
}
return rez;
}
long long inv(long long x) {
long long a, b;
long long d = euclid(x, MODULUS, a, b);
return a;
}
int main()
{
f >> A >> B;
// euclid(A, B, &B, &A);
factorizeaza(A);
ridica_la_putere(B);
long long s = 1;
for (int i=0; i<nr_prime; i++) {
// cout << prime[i] << ' ' << putere[i] << endl;
if (prim[i]%MODULUS==1) {
s = (s * (putere[i] + 1)) % MODULUS;
} else {
s = (s * (pow(prim[ i], putere[i]+1) - 1)) % MODULUS;
s = (s * inv(prim[i] - 1)) % MODULUS;
}
}
g << s;
return 0;
}