Pagini recente » Cod sursa (job #329910) | Cod sursa (job #2737404) | Cod sursa (job #3212300) | Cod sursa (job #3275371) | Cod sursa (job #1062300)
#include <iostream>
#include <fstream>
#include <cmath>
#define MAX 50000010
#define MODULUS 9901
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
int A, B;
int prime[8000];
int putere[MAX];
int nr_prime=0;
int factorizeaza(int n) {
int nr, t;
for (int i=2, sq=sqrt(n); i<=sq; i++) {
nr = 0;
while (n%i==0) {
n /= i;
nr++;
}
if (nr>0) {
prime[nr_prime] = i;
putere[nr_prime] = nr;
nr_prime++;
}
}
if (n>1) {
prime[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;
}
}
int euclid(int x, int y, int *a, int *b) {
if (y==0) {
*a = 1;
*b = 0;
return x;
} else {
int ap, bp;
int d = euclid(y, x%y, &ap, &bp);
*a = bp;
*b = (MODULUS + ap - ((long long)(*a)*(long long)(x/y)) ) % MODULUS;
return d;
}
}
int pow(int x, int p) {
int 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;
}
int inv(int x) {
int a, b;
int d = euclid(x, MODULUS, &a, &b);
return a;
}
int main()
{
f >> A >> B;
// euclid(A, B, &B, &A);
factorizeaza(A);
ridica_la_putere(B);
int s = 1;
for (int i=0; i<nr_prime; i++) {
// cout << prime[i] << ' ' << putere[i] << endl;
s = (s * (pow(prime[i], putere[i]+1) - 1) * inv(prime[i] - 1)) % MODULUS;
}
g << s;
return 0;
}