Mai intai trebuie sa te autentifici.
Cod sursa(job #2922569)
Utilizator | Data | 8 septembrie 2022 22:01:44 | |
---|---|---|---|
Problema | Suma divizorilor | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 0.85 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "sumdiv.in" );
ofstream fout( "sumdiv.out" );
const int MOD = 9901;
int lgpow( int a, int n ) {
int p = 1;
a %= MOD;
for ( ; n; n >>= 1 ) {
if ( n & 1 ) p = p * a % MOD;
a = a * a % MOD;
}
return p;
}
int main() {
int a, b, d = 2, res = 1;
fin >> a >> b;
while ( d * d <= a ) {
int e = 0;
while ( a % d == 0 ) {
++e;
a /= d;
}
if ( d % MOD != 1 ) {
res = (res * (lgpow( d, e * b + 1 ) - 1 + MOD)) % MOD;
res = (res * lgpow( d - 1, MOD - 2 )) % MOD;
} else {
res = (res * (e * b + 1)) % MOD;
}
++d;
}
if ( a != 1 ) {
if ( a % MOD != 1 ) {
res = (res * (lgpow( a, b + 1 ) - 1 + MOD)) % MOD;
res = (res * lgpow( a - 1, MOD - 2 )) % MOD;
} else {
res = (res * (b + 1)) % MOD;
}
}
fout << res;
fin.close();
fout.close();
return 0;
}