Cod sursa(job #2113022)

Utilizator crastanRavariu Eugen crastan Data 24 ianuarie 2018 10:25:28
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <fstream>
using namespace std;
#define p 9901
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int a,b,n,nrnr=1,nrdiviz=0,i,x,y,d,r,s=1;
int nrprime[100000],diviz[100000],qdiviz[100000];
int mod(int x)
{
    if(x>p)
        x%=p;
    return x;
}
void inversModular(int a,int b,int &x,int &y,int &d)
{
    if(b==0)
    {
        x=1;
        y=0;
        d=a;
    }
    else
    {
        int x0,y0;
        inversModular(b,a%b,x0,y0,d);
        x=y0;
        y=x0-(a/b)*y0;
    }
}
int logPut(int a,int b)
{
    if(b==0) return 1;
    if(b==1) return a;
    int aux=mod(logPut(a,b/2));
    if(b&1) return mod(mod(aux*aux)*a);
    else return mod(aux*aux);
}
void generareNrPrime(int n)
{
    nrprime[1]=2;
    for(int i=3;i<=n;i+=2)
    {   int ok=1;
        for(int j=2;j<=nrnr&&nrprime[j]*nrprime[j]<=i;j++)
        {
            if(i%nrprime[j]==0)
            {
                ok=0;break;
            }
        }
        if(ok)
        {
            nrnr++;
            nrprime[nrnr]=i;
        }
    }


}
int main()
{
    fin>>a>>b;
    generareNrPrime(a);
    for(i=1;i<=nrnr&&a!=1;i++)
        if(a%nrprime[i]==0)
        {
            nrdiviz++;
            diviz[nrdiviz]=nrprime[i];
            while(a%nrprime[i]==0)
            {
                a/=nrprime[i];
                qdiviz[nrdiviz]++;
            }
        }
    for(i=1;i<=nrdiviz;i++)
        qdiviz[i]*=b;
    for(i=1;i<=nrdiviz;i++)
    {
        r=logPut(diviz[i],qdiviz[i]+1)-1;
        if(r<0)r+=p;
        inversModular(diviz[i]-1,p,x,y,d);
        while(x<0)x+=p;
        x=mod(x);
        r*=x;
        r=mod(r);
        s*=r;
        s=mod(s);
    }
    fout<<s;

    return 0;
}