Cod sursa(job #1902576)

Utilizator rares_ciocieaRares Andrei Ciociea rares_ciociea Data 4 martie 2017 17:54:54
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>

using namespace std;
ifstream in("sumdiv.in");
ofstream out("sumdiv.out");
unsigned long long a,b;
unsigned long long put(unsigned long long n,unsigned long long p)
{
  unsigned long long r=1,c;
    while(p!=1)
    {
        if(p%2==0)
        {
            p=p/2;
            n=(n*n)%9901;
        }
        else
        {
            p=p-1;
            r=(r*n)%9901;
        }
    }
    n=n*r;
    return n%9901;
}
long long invers(int a, int m)
{
    int m0=m, t, q;
    int x0=0, x1=1;
    if (m==1)
      return 0;
    while (a>1)
    {
        q=a/m;
        t=m;
        m=a%m, a=t;
        t=x0;
        x0=x1-q*x0;
        x1=t;
    }
    if (x1 < 0)
       x1 += m0;

    return x1;
}
void desc()
{
    unsigned long long j=2,p,n=9901;
    unsigned long long sol=1;
    for(j=2; j*j<=a; j++)
    {
        if(a%j==0)
        {
            p=0;
            while(a%j==0)
            {
                p++;
                a/=j;
            }
            p*=b;
            sol*=invers(((put(j,p+1)-1)/(j-1)),9901);

            sol%=n;
        }

    }
    if(a!=1)
    {
        p=b;
        sol*=((put(a,p+1)-1)/(a-1));
        sol%=n;
    }
    out<<sol%9901;
}
int main()
{
    in>>a>>b;
    desc();
    return 0;
}