Cod sursa(job #1688173)

Utilizator KOzarmOvidiu Badea KOzarm Data 13 aprilie 2016 12:11:31
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>

using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
long long n,m,sum,i;
int exp(int x,int p)
{
    if(p==0)
        return 1;
    else
    if(p%2==1)
        return x*exp(x,p-1)%9901;
    else
    {
        int t=exp(x,p/2)%9901;
        return t*t%9901;
    }
}
void euclid(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1;
        y=0;
    }
    else
    {
        euclid(b,a%b,x,y);
        int aux=x;
        x=y;
        y=aux-a/b*y;
    }
}
int invers(int a,int b)
{
    int x,y;
    euclid(a,b,x,y);
    while(x<0)
        x+=b;
    x%=9901;
    return x;
}
int main()
{
    fin>>n>>m;
    if(m==0)
    {
        fout<<1;
        return 0;
    }
    else
    while(n%9901==0)
        n/=9901;
    sum=1;
    for(i=2;i<=n/i;i++)
    {
        if(n%i==0)
        {
            int s=0;
            while(n%i==0)
            {
                s++;
                n/=i;
            }
            sum=sum*((exp(i,m*s+1)-1)%9901)*invers(i-1,9901)%9901;
        }
    }
    if(n!=1)
        sum=sum*((exp(n,m+1)-1)%9901)*invers(n-1,9901)%9901;
    fout<<sum;
    return 0;
}