Pagini recente » Cod sursa (job #789501) | Cod sursa (job #3215647) | Borderou de evaluare (job #3173669) | Cod sursa (job #1611411) | Cod sursa (job #3000576)
#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;
}