Pagini recente » Cod sursa (job #2817834) | Cod sursa (job #751445) | Cod sursa (job #2443477) | Cod sursa (job #1498635) | Cod sursa (job #2859284)
#include <fstream>
using ull = unsigned long long;
ull fi(ull);
ull putere_mod(ull, ull, ull);
int main() {
ull a, n;
std::ifstream fin("inversmodular.in");
fin >> a >> n;
fin.close();
std::ofstream fout("inversmodular.out");
fout << putere_mod(a, fi(n) - 1, n) << '\n';
fout.close();
return 0;
}
ull fi(ull x) {
ull ret = 1, d = 3;
bool ok = false;
while (x % 2 == 0) {
ret = ret << 1;
x = x >> 1;
ok = true;
}
if (ok) ret = (ret >> 1);
ok = false;
while (x > 1) {
if (x % d == 0) {
ret *= d;
x /= d;
ok = true;
}
else {
if (ok) ret = (ret / d) * (d - 1);
ok = false;
d += 2;
}
}
if (ok) ret = (ret / d) * (d - 1);
return ret;
}
ull putere_mod(ull b, ull p, ull m) {
if (p == 0) return 1;
if (p % 2 == 0) return putere_mod(b * b, p / 2, m) % m;
return (b * putere_mod(b * b, p / 2, m)) % m;
}