Cod sursa(job #2978816)

Utilizator Elvis_CostinTuca Elvis-Costin Elvis_Costin Data 14 februarie 2023 15:15:41
Problema Invers modular Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string np = "inversmodular";
ifstream f(np + ".in");
ofstream g(np + ".out");

// #define f cin
// #define g cout

ll a, n;

bool eprim(ll n)
{
    if (n < 2 or (n % 2 == 0 and n != 2))
        return 0;
    for (ll i = 3; i * i <= n; i += 2)
        if (n % i == 0)
            return 0;
    return 1;
}
ll Phi(ll n)
{
    ll rez = n;
    for (ll i = 2; i * i <= n; i++)
        if (n % i == 0)
        {
            rez /= i;
            rez *= (i - 1);
            while (n % i == 0)
                n /= i;
        }
    if (n > 1)
        rez /= n, rez *= (n - 1);
    return rez;
}
ll fastpow(ll a, ll b, ll mod)
{
    ll rez = 1;
    a %= mod, b %= mod;
    while (b)
    {
        if (b % 2 == 1)
            rez = (1LL * rez * a) % mod;
        a = (1LL * a * a) % mod;
        b /= 2;
    }
    return rez;
}
int main()
{
    f >> a >> n;

    if (eprim(n))
        g << fastpow(a, n - 2, n);
    else
        g << fastpow(a, Phi(n) - 1, n);

    return 0;
}