Cod sursa(job #1989082)

Utilizator ANdreeADiana27Alexa Andreea ANdreeADiana27 Data 5 iunie 2017 19:08:30
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <cmath>
#include <fstream>

using namespace std;

ifstream f("sumdiv.in");
ofstream g("sumdiv.out");

int vp[78500];
long long s,a,b,aa,bb,aux;
long long Exp_Log_Mod(long long a,long long b,long long pr)
{
    long long rez=1;
    while(b)
    {
        if(b%2)
        {
            rez=(rez%pr)*(a%pr)%pr;
            b--;
        }
        else
        {
            a=(a%pr)*(a%pr)%pr;
            b/=2;
        }
    }
    return rez;
}

long long Fractie(long long d,long long p,long long pr)
{
    long long nmrt,numi;
    nmrt=Exp_Log_Mod(d,p,pr)-1;
    numi=Exp_Log_Mod(d-1,pr-2,pr);
    return (nmrt*numi)%pr;
}

void Nr_Sum_Div(long long x,long long bb)
{
    int r,p,i=1;
    long long aux;
    s=1;
    r=sqrt(x);
    while(vp[i]<=r)
    {
        p=0;
        while(x%vp[i]==0)
        {
            p++;
            x/=vp[i];
        }
        if(p)
        {
            aux=p*bb%pr;
            s=s*Fractie(vp[i],aux+1,9901)%9901;
            r=sqrt(x);
        }
        i++;
    }
    if(x!=1)
       s=s*Fractie(x,bb+1,9901)%9901;
}

void Ciur()
{
    int n=0;
    int i,j;
    bool c[1000000];
    for(i=2;i<=1000000;i++)
        if(!c[i])
        {
            vp[++n]=i;
            for(j=2*i;j<=1000000;j+=i)
                c[j]=1;
        }
}

int main()
{
    Ciur();
    f>>aa>>bb;
    Nr_Sum_Div(aa,bb);
    g<<s;
    f.close();
    g.close();
    return 0;
}