Pagini recente » Cod sursa (job #1417401) | Cod sursa (job #570367) | Cod sursa (job #2043282) | Cod sursa (job #2433585) | Cod sursa (job #933209)
Cod sursa(job #933209)
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("inversmodular.in");
ofstream fout("inversmodular.out");
typedef long long int64;
inline int64 log_pow(int x, int p);
inline int mod(int64 x, int m);
inline int phi(int x);
int A, N;
int main() {
fin >> A >> N;
fout << log_pow(A, phi(N) - 1);
return 0;
}
inline int64 log_pow(int x, int pow) {
int64 result = 1;
for (int64 p = 1, log2_p = x; p <= pow; p *= 2) {
if (p & pow) {
result = mod(result * log2_p, N);
}
log2_p = mod(log2_p * log2_p, N);
}
return result;
}
inline int phi(int x) {
int result = x;
for (int d = 2; d * d <= x; ++d) {
if (x % d == 0) {
while (x % d == 0) x /= d;
result = (result / d) * (d - 1);
}
}
if (x != 1) result = (result / x) * (x - 1);
return result;
}
inline int mod(int64 x, int m) {
if (x < m) return x;
if (x < 2 * m) return x - m;
return x % m;
}