Cod sursa(job #1809055)

Utilizator robx12lnLinca Robert robx12ln Data 18 noiembrie 2016 16:56:38
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#define MOD 9901
#define DIM 8000
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
long long a, b, x[DIM], k, c;
long long sol, invsmod;
char w[DIM + 5];
long long lgput( long long x, long long p ){
    long long r = 1;
    while( p != 0 ){
        if( p % 2 == 1 ){
            r = r * x % MOD;
        }
        x = x * x % MOD;
        p /= 2;
    }
    return r % MOD;
}
int main(){
    fin >> a >> b;
    w[0] = w[1] = 1;
    for( long long i = 2; i <= DIM; i++ ){
        if( w[i] == 0 ){
            x[++k] = i;
            for( long long j = i + i; j <= DIM; j+= i ){
                w[j] = 1;
            }
        }
    }
    c = a;
    sol = 1;
    for( long long i = 1; i <= k && x[i] * x[i] <= a && c != 1; i++ ){
        long long e = 0;
        while( c % x[i] == 0 ){
            e++;
            c /= x[i];
        }
        if( e != 0 ){
            long long r = ( lgput( x[i], e * b + 1 ) - 1 ) % MOD;
            invsmod = lgput( x[i] - 1, MOD - 2 );
            sol = sol * r % MOD * invsmod % MOD;
        }
    }
    if( c != 1 ){
        if( c % MOD == 1 ){
            sol = ( sol * ( b + 1 ) ) % MOD;
        }else{
            long long r = ( lgput( c, b + 1 ) - 1 ) % MOD;
            invsmod = lgput( c - 1, MOD - 2 );
            sol = sol * r % MOD * invsmod % MOD;
        }
    }
    while( sol < 0 ){
        sol += MOD;
    }
    fout << sol << "\n";
    return 0;
}