Cod sursa(job #1685896)

Utilizator KOzarmOvidiu Badea KOzarm Data 11 aprilie 2016 22:03:46
Problema Suma divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 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;
    sum=1;
    for(i=2;i*i<=n;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(n-1,9901)%9901;
        }
    }
    if(n!=1)
        sum=sum*((exp(n,m+1)-1)%9901)*invers(n-1,9901)%9901;
    fout<<sum;
    return 0;
}