Cod sursa(job #1915706)

Utilizator silkMarin Dragos silk Data 8 martie 2017 22:11:17
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>

const int MOD = 9901;

int LgPut(int X, int B)
{
    int A = 1;
    while(B)
    {
        if(B%2) A=(1LL*A*X)%MOD;
        X=(1LL*X*X)%MOD;
        B/=2;
    }
    return A;
}

int Compute(int A, int B)
{
    if(!B) return 1;
    if(B % 2 == 0) return (1LL * Compute(A,B-1) * A + 1) % MOD;
    return (Compute(A,B/2) * (1 + LgPut(A,B/2+1))) % MOD;
}

int main(){
    FILE* fin = fopen("sumdiv.in","r");
    FILE* fout = fopen("sumdiv.out","w");

    int i,A,B,res=1,nr=0;

    fscanf(fin,"%d %d",&A,&B);
    if(!A) { fprintf(fout,"0\n"); return 0; }
    for(i = 2; i * i <= A; ++i)
    if(A % i == 0){
        nr = 0;
        while(A % i == 0) { A /= i; ++nr; }
        res = (res * Compute(i,nr*B)) % MOD;
    }

    printf("%d\n",A);
    if(A > 1) res = (res * Compute(A,B)) % MOD;
    fprintf(fout,"%d\n",res);

    fclose(fin);
    fclose(fout);


return 0;
}