Cod sursa(job #1387785)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 14 martie 2015 17:51:33
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<fstream>
#include<math.h>
#define nmax 8002
using namespace std;
int ciur[nmax],diviz[nmax];
long long a,b,db[nmax],s,j,y,i,p;
int main ()
{
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");
    ciur[1]=1;
    fin>>a>>b;
    if(a>1)
    {
        y=sqrt(a)+1;
        for(i=2;i*i<=y;i++)
        {
            if(ciur[i]==0)
            {
                for(j=i*i;j<=y;j=j+i)
                {
                    ciur[j]=1;
                }
            }
        }
        for(i=2;i<=y;i++)
        {
            if(ciur[i]==0)
            {
                while(a%i==0)
                {
                    diviz[i]=diviz[i]+1;
                    a=a/i;
                }
            }
        }
        s=1;
        for(i=2;i<=y;i++)
        {
            if(diviz[i]!=0)
            {
                diviz[i]=diviz[i]*b;
                db[i]=1;
                while(diviz[i]+1!=0)
                {
                    db[i]=(db[i]*i)%9901;
                    diviz[i]=diviz[i]-1;
                }
                p=1;
                while(p*(i-1)%9901!=1)
                {
                    p++;
                }
                s=s*(db[i]-1)*p;
                s=s%9901;
            }
        }
        if(a!=1)
        {
            j=1;
            while(b+1!=0)
            {
                j=(j*a)%9901;
                b--;
            }
            p=1;
            while(p*(a-1)%9901!=1)
            {
                p++;
            }
            s=s*(j-1)*p;
            s=s%9901;
        }
        fout<<s;
    }
    else
    {
        fout<<a;
    }
    fin.close();
    fout.close();
    return 0;
}