Cod sursa(job #893837)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 26 februarie 2013 18:11:51
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <fstream>

using namespace std;

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

const int mod= 9901;
const int nmax= 50000000;
const int dmax= 8; //= maximum number of different prime divisors for x<=nmax;

int exp(int x, int y){
    x%= mod;
    y%= (mod-1);
    int sol= 1;
    for (int i= 1; i<=y; i*= 2){
        if (i&y){
            sol= (sol*x)%mod;
        }
        x= (x*x)%mod;
    }
    return sol;
}

inline int inv(int x){
    return exp(x, mod-2);
}

int comp_d(int &a, int b, int x){
    int e= 0;
    while (a%x==0){
        a/= x;
        ++e;
    }
    printf("%d\n", e);
    return ((exp(x, e*b+1)-1)*inv(x-1) +mod) %mod;
}

int main(){
    int a, b;
    fin>>a>>b;
    b%= (mod-1);
    if (a==0){
        fout<<"0\n";
        return 0;
    }

    int sol= 1;
    for (int i= 2; i*i<=a; ++i){
        if (a%i==0){
            sol= (sol*comp_d(a, b, i)) %mod;
        }
    }
    if (a!=1){
        sol= (sol*comp_d(a, b, a)) %mod;
    }
    fout<<sol<<"\n";

    return 0;
}