Cod sursa(job #2664319)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 28 octombrie 2020 14:49:37
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
using namespace std;
const int MOD = 9901;
int lgput( int a, int n ) {
    int p = 1;
    while (n > 0) {
        if (n % 2 == 1)
            p = ( ( long long ) p * a) % MOD;
        a = ( long long ) a * a % MOD;
        n >>= 1;
    }
    return p;
}
ifstream fin( "sumdiv.in" );
ofstream fout( "sumdiv.out" );
int main() {
    int n, k, d, sum, e;
    fin >> n >> k;
    sum = (n > 0);
    for ( d = 2; d * d <= n; d += 1 + d % 2 )
        if ( n % d == 0 ) {
            e = 0;
            do {
                e++;
                n /= d;
            } while ( n % d == 0 );
            e *= k;
            if ( d % MOD == 1)
                sum = (long long) sum * ( ( long long ) e + 1) % MOD;
            else {
                sum = ( (long long) sum * (lgput( d % MOD, e + 1 ) + MOD - 1 ) ) % MOD;
                sum = (long long) sum * lgput( (d % MOD + MOD - 1) % MOD , MOD - 2 ) % MOD;
            }
            
        }
    if ( n > 1 ) {
        if ( n % MOD == 1)
            sum = (long long) sum * ( (long long ) k + 1) % MOD;
        else {
            sum = ( (long long) sum * (lgput( n % MOD, k + 1 ) + MOD - 1 )) % MOD;
            sum = (long long) sum * lgput( (n % MOD + MOD - 1) % MOD , MOD - 2 ) % MOD;
        }
    }
    fout << sum;
    
    return 0;
}