Cod sursa(job #2228356)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 3 august 2018 14:26:42
Problema Invers modular Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <iostream>

using namespace std;
long long int PN(int a)
{
    int i, copie;

    copie = a;

    for(i = 2; i * i <= a; i++)
    {
        if(a % i == 0)
        {
            while(a % i == 0)a /= i;
            copie = (copie / i) * (i - 1);
        }
    }

    if(a != 1)copie = (copie / a) * (a - 1);
    return copie;
}


long long int ridicarePutereLogaritmica(int baza, int p, int modulo)
{
    long long int putere = 1;

    while(p >= 1)
    {
        if(p % 2 == 1)putere = (putere * baza) % modulo;

        baza *= baza;
        p /= 2;
    }

    return putere;
}
int main()
{
    long long int a, n, inversModular, Pn;

    ifstream fin("inversmodular.in");
    ofstream fout("inversmodular.out");

    fin >> a >> n;

    Pn = PN(n);
    Pn--;

    inversModular = ridicarePutereLogaritmica(a, Pn, n);

    fout << inversModular;

    fin.close();
    fout.close();

    return 0;
}