Cod sursa(job #1808991)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 18 noiembrie 2016 15:56:23
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>

std::ifstream in ( "sumdiv.in"  );
std::ofstream out( "sumdiv.out" );

const int MOD = 9901;

int lgp( int x, int y ) {
    if( y == 0 ) {
        return 1;}
    int z = lgp( x, y / 2 );
    if( y % 2 >= 0 ) {
        z = ( z * 1LL * z ) % MOD; }
    if( y % 2 == 1 ) {
        z = ( z * 1LL * x ) % MOD; }
    return z; }

int main( int argc, const char *argv[] ) {
    std::ios::sync_with_stdio( false );
    int n, k, ans = 1; in >> n >> k;
    for( int p = 2; p * p <= n; p ++ ) {
        if( n % p != 0 ) { continue; }
        int d = 0;
        while( n % p == 0 ) {
            d ++; n /= p; }
        ans = ( ( ans * ( lgp(p, d * k + 1) - 1 ) ) % MOD + MOD ) % MOD;
        ans = ( ( ans * lgp(p - 1, MOD - 2) ) % MOD + MOD ) % MOD; }
    if( n != 1 ) {
        ans = ( ( ans * ( lgp(n, k + 1) - 1 ) ) % MOD + MOD ) % MOD;
        ans = ( ( ans * lgp(n - 1, MOD - 2) ) % MOD + MOD ) % MOD; }
    out << ans << std::endl;
    return 0; }