Cod sursa(job #1786211)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 22 octombrie 2016 16:37:27
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>

using namespace std;
int k,i,j,a,b,p,p1,p2,t,nr,v[1000],w[7100];
int putere(int q, int x, int r)
{
    p=1;
    while(x)
    {
        if(x%2) p*=q;
        q*=q;
        x/=2;
        p=p%r;
        q=q%r;
    }
    return p;
}
int main()
{
    ifstream f("sumdiv.in");
    ofstream g("sumdiv.out");
    v[1]=2;
    k=1;
    i=3;
    while(i*i<=7071)
    {
        for(j=i*i; j<=7071; j+=2*i)
            w[j]=1;
        i+=2;
        while(w[i]) i+=2;
    }
    for(i=3; i<=7071; i+=2)
    if(w[i]==0)
    {
        k++;
        v[k]=i;
    }
    f>>a>>b;
    t=9901;
    i=1;
    p1=1;
    p2=1;
    while(a>1&&i<=k)
    {
        if(a%v[i]==0)
        {
            nr=0;
            while(a%v[i]==0)
            {
                a/=v[i];
                nr++;
            }
            p1*=(putere(v[i],nr*b+1,t)-1);
            p2*=(v[i]-1);
        }
        i++;
    }
    if(a>1)
    {
        p1*=(putere(a,b+1,t)-1);
        p2*=(a-1);
    }
    g<<(p1*putere(p2,t-2,t))%t<<'\n';
    f.close(); g.close();
    return 0;
}