Pagini recente » Cod sursa (job #2007239) | Cod sursa (job #74940) | Profil Andrei-27 | Istoria paginii utilizator/vrebiegiegrejgoperpegorogpe | Cod sursa (job #2703043)
#include <bits/stdc++.h>
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
const int MOD = 9901;
bitset <1000001> prime;
vector <long long> v;
int t;
long long x;
void sieve(){
v.reserve(78498);
for(long long i = 3;i * i <= 1000000;i += 2)
if(!prime[i]){
for(long long j = i * i;j <= 1000000; j += 2 * i)
prime[j] = 1;
}
v.emplace_back(2);
for(int i = 3;i <= 1000000;i += 2)
if(!prime[i]) v.emplace_back(i);
}
long long BinPow(long long a, long long b){
long long res = 1;
a %= MOD;
while(b > 0){
if(b & 1)
res = (res * a) % MOD;
a = (a * a) % MOD;
b >>= 1;
}
return res;
}
void BinSumDiv(long long x, int pw){
int i = 0, N = 78498;
long long sd = 1;
while(v[i] * v[i] <= x && i < N){
int fm = 0;
while(x % v[i] == 0){
fm++;
x /= v[i];
}
if(fm){
long long p = BinPow(v[i], pw * fm + 1);
sd = sd * ((p - 1 + MOD) * BinPow(v[i] - 1, MOD - 2) % MOD) % MOD;
}
i++;
}
if(x != 1) sd = sd * ((BinPow(x, pw + 1) - 1 + MOD) * BinPow(x - 1, MOD - 2) % MOD) % MOD;
g << sd << "\n";
}
int main(){
sieve();
int x, y;
f >> x >> y;
BinSumDiv(x, y);
}