Cod sursa(job #1341361)

Utilizator retrogradLucian Bicsi retrograd Data 12 februarie 2015 17:35:31
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<fstream>

using namespace std;
typedef int64_t var;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

const var MOD = 9901;

var DIV[200], EXP[200];


var put(var b, var e) {
    if(e == 0) return 1;
    if(e%2 == 1) {
        return ( b * put(b, e-1) )%MOD;
    } else {
        return ( put(( b*b )%MOD, e/2) )%MOD;
    }
}

inline var inv(var b) {
    return ( put(b, MOD-2) )%MOD;
}


int main() {
    var a, b, i=0, d, ndiv;
    fin>>a>>b;

    if(a == 0) {
        fout<<0;
        return 0;
    }

    if(b == 0) {
        fout<<1;
        return 0;
    }

    for(var d=2; d*d<=a; d++) {
        if(a%d==0) {
            DIV[++i] = d;
        }
        while(a%d==0) {
            EXP[i] ++;
            a /= d;
        }
    }
    if(a>1) {
        DIV[++i] = a;
        EXP[i] = 1;
    }
    ndiv = i;

    for(i=1; i<=ndiv; i++) {
        EXP[i] *= b;
    }

    var rez = 1;

    for(var i=1; i<=ndiv; i++) {
        if(DIV[i] % MOD != 1) {
            rez *= put(DIV[i], EXP[i]+1) + MOD-1;
            rez %= MOD;
            rez *= inv((DIV[i] - 1)%MOD);
            rez %= MOD;
        } else {
            rez *= EXP[i]+1;
            rez %= MOD;
        }
    }

    fout<<rez%MOD;


    return 0;
}