Cod sursa(job #2664192)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 28 octombrie 2020 09:18:31
Problema Suma divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 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 );
            if ( e > 0 )
                e *= k;
            if ( d % MOD == 1)
                sum = (long long) sum * (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 * (k + 1) % MOD;
        else {
            sum = ( (long long) sum * lgput( n, k + 1 ) + MOD - 1 ) % MOD;
            sum = (long long) sum * lgput( (n + MOD - 1) % MOD , MOD - 2 ) % MOD;
        }
    }
    fout << sum;
    
    return 0;
}