Cod sursa(job #2467832)

Utilizator DumnezeuSPinzaru Alex DumnezeuS Data 5 octombrie 2019 08:54:31
Problema Invers modular Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>
#include <fstream>
using namespace std;



int LogP(int a,int n,int MOD)
{
    int p=1;
    while(n>0)
    {
        if(n%2==1) p=1LL*p*a%MOD;
        n/=2;
        a=1LL*a*a%MOD;
    }
    return p;
}

/**
Phi(n)=n*(p1-1)*(p2-1)*...*(pk-1)/(p1*p2*...*pk)
unde p1...pk = factorii lui n

12=2^2*3^1
Phi(12)=12*(2-1)*(3-1)/(2*3)=4
*/

int Phi(int n)
{
    int sol=n,p;
    for(p=2;p*p<=n and n>1;p++)
    {
        if(n%p==0)
            sol=sol/p*(p-1);
        while(n%p==0)
            n/=p;
    }
    if(n>1)
        sol=sol/n*(n-1);
    return sol;
}

int main()
{
    int a,phi,n;
    ifstream fin("inversmodular.in");
    ofstream fout("inversmodular.out");
    fin>>a>>n;
    phi=Phi(n);
    fout<<LogP(a,phi-1,n)<<"\n";
    fin.close();
    fout.close();


    return 0;
}