Cod sursa(job #1810368)

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