Cod sursa(job #1387851)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 14 martie 2015 19:17:15
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include<fstream>
#include<math.h>
#define nmax 8002
using namespace std;
int ciur[nmax];
long long a,b,db,diviz,s,j,y,i,p,aa,d;

inline long long gcd( long long A, long long B, long long &X, long long &Y )
{
    if (B == 0)
    {
        X = 1;
        Y = 0;
        return A;
    }

    long long X0, Y0, D;
    D = gcd( B, A % B, X0, Y0 );

    X = Y0;
    Y = X0 - (A / B) * Y0;
    return D;
}
int main ()
{
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");
    ciur[1]=1;
    fin>>a>>b;
    y=sqrt(a)+1;
    s=1;
    for(i=2;i*i<=a;i++)
    {
        if(ciur[i]==0)
        {
            for(j=i*i;j*j<=a;j=j+i)
            {
                ciur[j]=1;
            }

            if(a%i==0)
            {
                diviz=0;
                while(a%i==0)
                {
                    diviz=diviz+1;
                    a=a/i;
                }
                diviz=diviz*b+1;
                db=1;
                p=i;
                while(diviz!=0)
                {
                    if(diviz%2==1)
                    {
                        db=(db*p)%9901;
                    }
                    p=(p*p)%9901;
                    diviz=diviz/2;
                }
                s=s*(db-1+9901);
                s=s%9901;

                d=gcd(i-1,9901,p,j);
                if(p<=0)
                {
                    p=9901+p%9901;
                }

                s=s*p;
                s=s%9901;
            }
        }
    }
    if(a!=1)
    {
        j=1;
        aa=a%9901;
        b++;
        while(b!=0)
        {
            if(b%2==1)
            {
                j=(j*aa)%9901;
            }
            aa=(aa*aa)%9901;
            b=b/2;
        }
        s=s*(j-1+9901);
        s=s%9901;

        d=gcd(a-1,9901,p,i);
        if(p<=0)
        {
            p=9901+p%9901;
        }

        s=s*p;
        s=s%9901;
    }
    fout<<s;
    fin.close();
    fout.close();
    return 0;
}