※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |