Cod sursa(job #1810351)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 19 noiembrie 2016 22:10:11
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
# include <fstream>
# define DIM 8000
# define MOD 9901
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int f[DIM],d[DIM/5],a,b,k,i,j,s,nr;
int putere(int a,int b){
    if(b==0)
        return 1;
    int t=putere(a,b/2);
    if(b%2==1)
        return (t*a%MOD)*t%MOD;
    else
        return t*t%MOD;
}
int euclid(int a,int b,int &x,int &y){
    if(!b){
        x=1;
        y=0;
        return a;
    }
    int xa,ya,r=euclid(b,a%b,xa,ya);
    x=ya;
    y=xa-(a/b)*ya;
    return r;
}
void op(int d,int p){
    int dp=putere(d%MOD,p+1),x,y;
    euclid(d-1,MOD,x,y);
    dp-=1;
    if(dp<0)
        dp+=MOD;
    s*=dp;
    s%=MOD;
    x%=MOD;
    if(x<0)
        x+=MOD;
    s*=x;
    s%=MOD;
}
int main () {
    fin>>a>>b;
    s=1;
    for(i=2;i*i<=a;i++){
        if(!f[i]){
            d[++k]=i;
            for(j=2*i;j*j<=a;j+=i)
                f[j]=1;
        }
    }
    for(i=1;i<=k;i++){
        nr=0;
        while(a%d[i]==0){
            a/=d[i];
            nr++;
        }
        if(nr)
            op(d[i],nr*b);
    }
    if(a!=1)
        op(a,b);
    fout<<s<<"\n";
    return 0;
}