Pagini recente » Cod sursa (job #3353333) | Cod sursa (job #558238) | Cod sursa (job #1978403) | Cod sursa (job #3356757) | Cod sursa (job #3322555)
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("sumdiv.in");
ofstream cout("sumdiv.out");
const int MOD = 9901;
long long fast_pow(long long base, long long exp)
{
long long res = 1;
base %= MOD;
while (exp > 0)
{
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
long long mod_inverse(long long base)
{
return fast_pow(base, MOD - 2);
}
long long sum_geometric_progression(long long p, long long N)
{
if (N == 0) return 1 % MOD;
if (p % MOD == 1) return (N + 1) % MOD;
long long numerator = (fast_pow(p, N + 1) - 1 + MOD) % MOD;
long long denominator_inverse = mod_inverse(p - 1);
return (numerator * denominator_inverse) % MOD;
}
int main()
{
long long A, B;
cin >> A >> B;
if (A == 0)
{
cout << 0 << endl;
return 0;
}
if (B == 0)
{
cout << 1 % MOD << endl;
return 0;
}
long long total_sum = 1;
long long temp_A = A;
for (long long i = 2; i * i <= temp_A; ++i)
{
if (temp_A % i == 0)
{
long long count = 0;
while (temp_A % i == 0)
{
temp_A /= i;
count++;
}
long long N = count * B;
long long term_sum = sum_geometric_progression(i, N);
total_sum = (total_sum * term_sum) % MOD;
}
}
if (temp_A > 1)
{
long long N = 1 * B;
long long term_sum = sum_geometric_progression(temp_A, N);
total_sum = (total_sum * term_sum) % MOD;
}
cout << total_sum << endl;
return 0;
}