Cod sursa(job #2517997)

Utilizator Rares31100Popa Rares Rares31100 Data 4 ianuarie 2020 17:46:46
Problema Invers modular Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;

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

int a,n;

int coprime(int nr)
{
    int fact[101],nrFact[101],t=0;
    int sum=1;

    int radNr=sqrt(nr);
    for(int d=2;d<=radNr && nr!=1;d++)
        if(nr%d==0)
        {
            fact[++t]=d;
            nrFact[t]=0;

            while(nr%d==0)
            {
                nrFact[t]++;
                nr/=d;
            }
        }

    if(nr!=1)
    {
        fact[++t]=nr;
        nrFact[t]=1;
    }

    for(int i=1;i<=t;i++)
        sum*=(int)(pow(fact[i],nrFact[i]-1)+0.5)*(fact[i]-1);

    return sum;
}

int logpow(int a,int p)
{
    int rez=1,inm=a;

    while(p)
    {
        if(p%2)
            rez=(rez*inm)%n;

        p/=2;
        inm=(inm*inm)%n;
    }

    return rez;
}

int main()
{
    in>>a>>n;

    int p=coprime(n);
    int rez=logpow(a,p-1);

    out<<rez;

    return 0;
}