※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 14565번 문제인 역원(Inverse) 구하기이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/14565 

 

14565번: 역원(Inverse) 구하기

집합 Zn을 0부터 n-1까지의 정수 집합이라고 하자. Zn ∋ a, b, c 일 때, (a+b) mod n = 0이면 b는 a의 덧셈역이라고 하고 (a*c) mod n = 1이면 c는 a의 곱셈역이라고 한다. 정수 N, A가 주어졌을 때 Zn에서의 A의

www.acmicpc.net

덧셈의 역원은 단순히 N에서 A를 빼는 것으로 간단히 구할 수 있다.

또한, 곱셈의 역원은 extended euclidean algorithm(확장 유클리드 알고리즘)을 통해 간단히 구할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <tuple>
using namespace std;
typedef long long ll;

tuple<ll,ll,ll> extgcd(ll a, ll b, ll p, ll q, ll r, ll s) {
	if (b == 0) return make_tuple(a, p, r);
	ll tmp = a / b;
	return extgcd(b, a - tmp * b, q, p - tmp * q, s, r - tmp * s);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	ll N, A; cin >> N >> A;
	cout << N - A << ' ';
	ll a, p, r;
	tie(a, p, r) = extgcd(A, N, 1, 0, 0, 1);
	p %= N;
	if (p < 0) p += N;
	if (a == 1) cout << p;
	else cout << -1;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2629 // C++] 양팔저울  (0) 2021.12.02
[BOJ 11635 // C++] Wipe Your Whiteboards  (0) 2021.12.01
[BOJ 10244 // C++] 최대공약수들  (0) 2021.11.29
[BOJ 11414 // C++] LCM  (0) 2021.11.28
[BOJ 4779 // C++] 칸토어 집합  (0) 2021.11.27

+ Recent posts