Pagini recente » Cod sursa (job #1798771) | Cod sursa (job #1506955) | Cod sursa (job #2118515) | Cod sursa (job #1711185) | Cod sursa (job #757496)
Cod sursa(job #757496)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define mod 9901
#define pb push_back
#define mkp make_pair
int A, B;
vector< pair<int, int> > divz;
void gcd(long long &x, long long &y, int a, int b) {
if (!b)
x = 1, y = 0;
else {
gcd(x, y, b, a % b);
long long aux = x;
x = y;
y = aux - y * (a / b);
}
}
int calc(int nr, int p) {
if(p == 0) return 1;
if(p == 1) return nr % mod;
int mid = p / 2;
int aux = calc(nr, mid);
int ret = ((long long)aux * aux) % mod;
if(p % 2 == 1) {
ret = ((long long)ret * nr) % mod;
}
return ret;
}
int solve(int left, int right) {
if(left == right) {
int number = divz[left].first;
int power = divz[left].second * B;
long long inv = 0, ins;
gcd(inv, ins, number - 1, mod);
if (inv <= 0) inv = mod + inv % mod;
int put = calc(number, power+1) - number % mod;
while(put < 0) put += mod;
// cout << number - 1 << " -> " << inv << endl;
put = ((long long)put * inv) % mod;
return put;
}
int mid = (left + right) >> 1;
int p1 = solve(left, mid);
int p2 = solve(mid+1, right);
return (p1 + p2 + p1 * p2) % mod;
}
int main() {
FILE * f1= fopen("sumdiv.in", "r"), * f2 = fopen("sumdiv.out", "w");
int i, j, p, q;
fscanf(f1, "%d %d\n", &A, &B);
if(A == 1) {
fprintf(f2, "%d\n", 1);
fclose(f1); fclose(f2);
return 0;
}
int nA = A;
for(i=2; i<=A; i++) {
if(nA == 1) break;
if(nA % i == 0) {
int put = 0;
while(nA % i == 0) {
put ++;
nA = nA / i;
}
divz.pb( mkp(i, put) );
j = A / i;
if(nA % j == 0) {
int put2 = 0;
while(nA % j == 0) {
put2 ++;
nA = nA / j;
}
divz.pb( mkp(j, put2) );
}
}
}
//for(i=0; i<divz.size(); i++) {
// cout << divz[i].first << " " << divz[i].second << endl;
//}
int sum = solve(0, divz.size()-1) + 1;
fprintf(f2, "%d\n", sum % mod);
fclose(f1); fclose(f2);
return 0;
}