Pagini recente » Cod sursa (job #1568214) | Cod sursa (job #2447659) | Cod sursa (job #513802) | Cod sursa (job #350534) | Cod sursa (job #3000588)
#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;
}