Cod sursa(job #2175472)

Utilizator MaxTeoTeo Oprescu MaxTeo Data 16 martie 2018 17:22:05
Problema Invers modular Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
using namespace std;

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

long long n,m,mod;

bool isPrime(long long x)
{
    for(int i=2;i*i<=x;++i)
        if(x%i==0)
            return 0;
    return 1;
}

long long getPhi(int x)
{
    int result=x;
    for(int p=2;p*p<=n;++p)
    {
        //Daca p e factor prim
        if(x%p==0)
        {
            while(x%p==0)
                x/=p;
            result-=result/p;
        }
    }

    //Daca mai este un factor prim peste sqrt(x)
    if(x>1)
        result-=result/n;

    return result;
}

inline long long exp(int a,int e)
{
    if(e==0)
        return 1;
    if(e==1)
        return a;
    if(e%2==0)
        return exp((a*a)%mod,e/2)%mod;
    else
        return (a*exp((a*a)%mod,(e-1)/2))%mod;
}

int main()
{
    f>>n>>m;
    mod=m;
    if(isPrime(m))
        g<<exp(n,m-2)<<"\n";
    else
    {
        int phi=getPhi(m);
        g<<exp(n,phi-1)<<"\n";
    }
    return 0;
}