Cod sursa(job #893620)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 26 februarie 2013 16:52:37
Problema Suma divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 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 vd[dmax+1], ve[dmax+1];

int exp(int x, int y){
    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;
    }
    return (exp(x, e*b+1)-1)*inv(x-1);
}

int main(){
    int a, b;
    fin>>a>>b;
    b%= (mod-1);

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

    return 0;
}