Cod sursa(job #3000588)

Utilizator IanisBelu Ianis Ianis Data 12 martie 2023 16:36:15
Problema Invers modular Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 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

const int SQRTN = 45000;

int n, m;
bool c[SQRTN];
vector<int> primes;

void ciur() {
    for (int i = 2; i < SQRTN; i++) {
        if (!c[i]) {
            primes.push_back(i);
        }
        for (int j = 0; j < primes.size() && 1ll * i * primes[j] < SQRTN; j++) {
            c[primes[j]] = 1;
            if (i % primes[j] == 0) break;
        }
    }
}

vector<pair<int, int>> fact(int n) {
    vector<pair<int, int>> ret;
    int i = 0;
    while (1ll * primes[i] * primes[i] <= n) {
        if (n % primes[i] == 0) {
            ret.push_back({primes[i], 0});
            while (n % primes[i] == 0) {
                ret.back().second++;
                n /= primes[i];
            }
        }
        i++;
    }
    if (n != 1) ret.push_back({n, 1});
    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() {
    ciur();
    fin >> n >> m;
    fout << pow(n, phi(m) - 1);
    return 0;
}