Cod sursa(job #2034484)

Utilizator aditoma2001Toma Adrian aditoma2001 Data 7 octombrie 2017 21:49:07
Problema Invers modular Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

#define ll long long

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

ll fi(ll n)
{
    bool div=0;
    ll inloc=n,prod=1;
    for (int i=2;i*i<=n;++i)
    {
        if (inloc%i==0)
        {
            div=1;
            while (inloc%i==0)
            {
                inloc/=i;  prod*=i;
            }
            prod/=i;
            ll el=prod*i;
            prod*=(i-1);
            if (inloc==1) break;
            if ((n/el)%i!=0)
            {
                while (inloc%(n/el)==0)
                {
                    inloc/=(n/el); prod*=(n/el);
                }
                prod*=(n/el-1);
                prod/=(n/el);
            }
        }
        if (inloc==1) break;
    }
    return (div==0 ? n-1 : prod);
}

ll exp_log(ll n,ll e,ll mod)
{
    ll sol=1;
    while (e!=0)
    {
        if (e%2==1) sol=sol*n%mod;
        n=n*n%mod;
        e/=2;
    }
    return sol%mod;
}

int main()
{
    ll a,n;
    f>>a>>n;
    g<<exp_log(a,fi(n)-1,n);
    return 0;
}