Cod sursa(job #2214339)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 18 iunie 2018 19:56:16
Problema Invers modular Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>

using namespace std;

ifstream in("inversmodular.in");
ofstream out("inversmodular.out");

const int MAXN = 2e9;
const int MAXA = 2e9;

int a, n;

int fi(int nr) {
	int ret = nr;

	if (nr % 2 == 0) {
    ret /= 2;
    ret *= (2 - 1);
    while (nr % 2 == 0)
      nr /= 2;
	}

	for (int i = 3; i * i <= nr && nr > 1; i += 2) {
		if (nr % i == 0) {
			ret /= i;
			ret *= (i - 1);
			while (nr % i == 0) nr /= i;
		}
	}

  if (nr > 1) {
  	ret /= nr;
  	ret *= (nr - 1);
  }

	return ret;
}

int put(int a, int b) {
	int ret = 1;

	while (b) {
		if (b & 1) ret = 1LL * ret * a % n;
		a = 1LL * a * a % n;
		b >>= 1;
	}

	return ret % n;
}

int invm(int a, int n) {
	return put(a, fi(n) - 1);
}

int main() {
	in >> a >> n;
	out << invm(a, n);

	return 0;
}