Cod sursa(job #3000576)

Utilizator IanisBelu Ianis Ianis Data 12 martie 2023 16:30:15
Problema Invers modular Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <algorithm>
#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

#ifdef LOCAL
ifstream fin("input.txt");
#define fout cout
#else
ifstream fin("inversmodular.in");
ofstream fout("inversmodular.out");
#define endl '\n'
#endif

int n, m;

vector<pair<int, int>> fact(int n) {
    vector<pair<int, int>> ret;
    for (int i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            if (i != 1) {
                ret.push_back({i, 0});
                while (n % i == 0) {
                    ret.back().second++;
                    n /= i;
                }
            }
            int b = n / i;
            ret.push_back({b, 0});
            while (n % b == 0) {
                ret.back().second++;
                n /= b;
            }
        }
    }
    return ret;
}

int pow(int a, int n) {
    if (n == 0) return 1;
    if ((n & 1) == 0) {
        int p = pow(a, n >> 1);
        return 1ll * p * p % m;
    }
    return 1ll * a * pow(a, n ^ 1) % m;
}

int phi(int n) {
    auto f = fact(n);
    int ret = 1;
    for (auto &it : f)
        ret *= pow(it.first, it.second - 1) * (it.first - 1);
    return ret;
}

int main() {
    fin >> n >> m;
    fout << pow(n, phi(m) - 1);
    return 0;
}