Pagini recente » Clasamentul arhivei educationale | Cod sursa (job #2921999) | Borderou de evaluare (job #2041128) | Clasamentul arhivei de probleme | Cod sursa (job #2985135)
#include <fstream>
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
const int MOD = 9901;
int factPrim[10], expPrim[10];
int nrPrim;
int lgPut(int a, int b) {
int res = 1;
while(b) {
if(b & 1) {
res = (res * a) % MOD;
b--;
}
a = (a * a) % MOD;
b /= 2;
}
return res;
}
int main()
{
int a, b;
f >> a >> b;
/// 18 3
/// 18 = 2 ^ 1 * 3 ^ 2
/// 18^3 = 2 ^ 3 * 3 ^ 6
if(a % 2 == 0) {
factPrim[++nrPrim] = 2;
while(a % 2 == 0) {
a /= 2;
expPrim[nrPrim]++;
}
}
for(int i = 3; i*i <= a; ++i) {
if(a % i == 0) {
factPrim[++nrPrim] = i;
while(a % i == 0) {
a /= i;
expPrim[nrPrim]++;
}
}
}
if(a > 1) {
factPrim[++nrPrim] = a;
expPrim[nrPrim] = 1;
}
int sum = 1;
for(int i = 1; i <= nrPrim; ++i) {
expPrim[i] *= b;
sum = (sum * lgPut(factPrim[i], expPrim[i] + 1) + MOD - 1) % MOD;
sum = (sum * lgPut(factPrim[i] - 1, MOD - 1)) % MOD;
}
g << sum;
return 0;
}