Cod sursa(job #1343791)

Utilizator EberardoVladianu Cosmin Eberardo Data 15 februarie 2015 22:05:57
Problema Invers modular Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>

using namespace std;
ifstream fin("inversmodular.in");
ofstream fout("inversmodular.out");
long long rez=1,a,n,eul;
void citire()
{
    fin>>a>>n;
}
void putere(long long x,long long nr,long long &rez)
{
    while(nr>0)
    {
        if(nr%2==0)
        {
            x=(x*x)%n;
            nr=nr/2;
        }
        else
        {
            rez=(rez*x)%n;
            x=(x*x)%n;
            nr=nr/2;
        }
    }

}
void euler(long long n)
{
    eul=n;
    long long m=n;
    bool p=1;
    long long d;
    if(n%2==0)
    {
        p=0;
        eul=eul/2;
        while(n%2==0)
            n=n/2;

    }

    for(d=3; d*d<=m; d=d+2)
    {
        if(n%d==0)
        {
            p=0;
            eul=eul/d*(d-1);
            while(n%d==0)
            {
                n=n/d;
            }

        }
    }
    if(n!=1) eul=eul/n*(n-1);

}
int main()
{
    citire();
    euler(n);
    putere(a,eul-1,rez);
    fout<<rez;

    return 0;
}