Cod sursa(job #1174730)

Utilizator andreiagAndrei Galusca andreiag Data 23 aprilie 2014 19:18:28
Problema Invers modular Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <fstream>

using namespace std;

int mypow(int n, int p, int mod)
{
    int sol = 1, a = n;
    while(p)
    {
        if (p & 1)
        { sol = (1ll*sol*a) % mod; }
        a = (1ll *a *a) % mod;
        p /= 2;
    }
    return sol;
}

int main()
{
    ifstream f ("inversmodular.in");
    ofstream g ("inversmodular.out");
    
    int A, N;
    f >> A >> N;
    int X = mypow(A, N-2, N);
    if ((1ll*A*X) % N == 1) {
        g << X << '\n';
        return 0;
    }
    
    int euphi = N;
    for (int i = 2; 1ll*i*i <= N; i++)
    {
        if (N % i == 0)
        {
            while(N % i == 0) N /= i;
            euphi -= euphi / i;
        }
    }
    if (N > 1) euphi -= euphi / N;
    X = mypow(A, euphi-1, N);
    g << X << '\n';

    return 0;
}