Cod sursa(job #756656)

Utilizator freak93Adrian Budau freak93 Data 10 iunie 2012 03:16:37
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.1 kb
#include<fstream>

using namespace std;

const char iname[]="sumdiv.in";
const char oname[]="sumdiv.out";
const long long mod=9901;

ifstream f(iname);
ofstream g(oname);

long long a,b,i,j,k,rez;

long long powx(long long x,long long y)
{
    x%=mod;
    long long sol=1;
    while(y)
    {
        if(y&1)
            sol*=x,sol%=mod;
        x*=x;
        x%=mod;
        y>>=1;
    }
    return sol;
}

long long ans(long long x,long long p)
{
    if(x%mod==1)
        return p*b+1;
    return ((powx(x,p*b+1)+mod-1)*powx(x-1,mod-2))%mod;
}

int main()
{
    f>>a>>b;
    rez=1;
    for(i=2;i*i<=a;++i)
        if(a%i==0)
        {
            j=0;
            while(a%i==0)
            {
                ++j;
                a/=i;
            }
            if(i%mod==1)
            {
                rez*=j*b+1,rez%=mod;
                continue;
            }
            rez*=ans(i,j);
            rez%=mod;
        }
    if(a>1)
    {
        rez*=ans(a,1);
        rez%=mod;
    }
    g<<rez<<"\n";

    f.close();
    g.close();

    return 0;
}