Pagini recente » Cod sursa (job #257286) | Cod sursa (job #3031508) | Cod sursa (job #1148016) | Cod sursa (job #480640) | Cod sursa (job #2766358)
#include <fstream>
#include <vector>
#define MOD 9901
using namespace std;
void ciur();
long long putere(long long a, long long b);
void sumadiv(long long p, long long q);
long long diffMOD(long long x, long long y);
int a, b;
vector<bool> isPrime(1e6 + 1, true);
vector<int> primes{ 2 };
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
int main() {
ciur();
f >> a >> b;
if (!((a || b) && b)) {
g << 1;
return 0;
}
if (!a) {
g << 0;
return 0;
}
sumadiv(a, b);
}
void ciur() {
fill(isPrime.begin(), isPrime.begin() + 2, false);
int i, j;
for (i = 4; i < isPrime.size(); i += 2) isPrime[i] = false;
for (i = 3; i < isPrime.size(); i += 2) {
if (isPrime[i]) {
primes.emplace_back(i);
for (j = 3 * i; j < isPrime.size(); j += 2 * i) isPrime[j] = false;
}
}
}
long long putere(long long a, long long b) {
long long result = 1;
a %= MOD;
for (; b; b /= 2) {
if (b % 2) result = (result * a) % MOD;
a = (a * a) % MOD;
}
return result;
}
void sumadiv(long long p, long long q) {
long long sd = 1;
int i, fm;
for (i = 0; primes[i] * primes[i] <= p && i < 78498; ++i) {
for (fm = 0; !(p % primes[i]); p /= primes[i], ++fm);
if (fm) {
switch (putere(primes[i], q * fm + 1)) {
case 1:
sd = (sd * (q * fm + 1)) % MOD;
break;
default:
sd = sd * diffMOD(putere(primes[i], q * fm + 1), 1) % MOD * putere(diffMOD(primes[i], 1), MOD - 2) % MOD;
break;
}
}
}
if (p != 1) {
if (p % MOD == 1)
sd = (sd * (q + 1)) % MOD;
else
sd = sd * diffMOD(putere(p, q + 1), 1) % MOD * putere(diffMOD(p, 1), MOD - 2) % MOD;
}
g << sd << '\n';
}
long long diffMOD(long long x, long long y) {
return ((x - y) % MOD + MOD) % MOD;
}