Cod sursa(job #1387813)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 14 martie 2015 18:24:57
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 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;
    if(a>1)
    {
        y=sqrt(a)+1;
        s=1;
        for(i=2;i<=y;i++)
        {
            if(ciur[i]==0)
            {
                for(j=i*i;j<=y;j=j+i)
                {
                    ciur[j]=1;
                }

                if(a%i==0)
                {
                    diviz=0;
                    while(a%i==0)
                    {
                        diviz=diviz+1;
                        a=a/i;
                    }
                    if(diviz!=0)
                    {
                        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;
                        }
                        d=gcd(i-1,9901,p,j);
                        s=s*(db-1);
                        s=s%9901;
                        s=s*p;
                        s=s%9901;
                    }
                }

                if(a==1)
                {
                    break;
                }
            }
        }
        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;
            }
            d=gcd(a-1,9901,p,i);
            s=s*(j-1);
            s=s%9901;
            s=s*p;
            s=s%9901;
        }
        fout<<s;
    }
    else
    {
        fout<<a;
    }
    fin.close();
    fout.close();
    return 0;
}