Cod sursa(job #1891119)

Utilizator lucametehauDart Monkey lucametehau Data 23 februarie 2017 19:07:45
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>

using namespace std;
ifstream cin("sumdiv.in");
ofstream cout("sumdiv.out");
long long n,x,y,exp,i,j,b[105],p[105],rez;
long long lgput(long long n,long long p)
{
    long long a,i,sol=1;
    a=n;
    for(i=0;(1<<i)<=p;i++)
    {
        if((p&(1<<i))>0)
            sol=(sol*a)%9901;
        a=(a*a)%9901;
    }
    return sol;
}
int main()
{
    cin>>x>>y;
    for(i=2;i*i<=x;i++)
    {
        exp=0;
        while(x%i==0)
        {
            exp++;
            x/=i;
        }
        if(exp)
        {
            n++;
            b[n]=i;
            p[n]=exp;
        }
    }
    if(x>1)
    {
        n++;
        b[n]=x;
        p[n]=1;
    }
    for(i=1;i<=n;i++)
        p[i]*=y;
    rez=1;
    for(i=1;i<=n;i++)
    {
        if((i==n&&b[i]%9901!=1)||i!=n)
        {
            rez=(rez*(lgput(b[i],p[i]+1)-1))%9901;
            rez=(rez*lgput(b[i]-1,9899))%9901;
        }
        else
            rez=(rez*(p[n]+1))%9901;
    }
    while(rez<0)
        rez+=9901;
    cout<<rez;
    return 0;
}