Skip to content

Commit afcbe58

Browse files
committed
docs: 확장 유클리드 알고리즘 사용 예제 추가
1 parent 5cadcc2 commit afcbe58

File tree

1 file changed

+40
-30
lines changed

1 file changed

+40
-30
lines changed

_posts/2024-03-06-modular-arithmetic.md

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -117,45 +117,55 @@ const modInverse = (a, m) => {
117117

118118
## Example
119119

120-
- <a href="https://www.acmicpc.net/problem/16134" target="_blank">16134번: 조합 (Combination)</a>
120+
- <a href="https://www.acmicpc.net/problem/3955" target="_blank">3955번: 캔디 분배</a>
121121

122-
```kotlin
123-
import java.io.*
122+
```javascript
123+
const path = process.platform === "linux" ? "/dev/stdin" : "input.txt";
124+
const input = require("fs").readFileSync(path).toString().split("\n");
125+
126+
const t = Number(input[0]); // 테스트 케이스의 개수, 0 < t < 100
127+
let answer = "";
128+
129+
const extendedGCD = (a, b) => {
130+
if (b === 0) {
131+
return { gcd: a, x: 1, y: 0 };
132+
} else {
133+
const { gcd, x: x1, y: y1 } = extendedGCD(b, a % b);
134+
135+
const x = y1;
136+
const y = x1 - Math.floor(a / b) * y1;
124137

125-
const val p = 1000000007
138+
return { gcd, x, y };
139+
}
140+
};
141+
142+
const modInverse = (a, m) => {
143+
const { gcd, x } = extendedGCD(a, m);
126144

127-
fun main() {
128-
val br = BufferedReader(InputStreamReader(System.`in`))
129-
val bw = BufferedWriter(OutputStreamWriter(System.out))
145+
if (gcd !== 1) {
146+
return "IMPOSSIBLE\n";
147+
}
148+
149+
let result = ((x % m) + m) % m;
130150

131-
// 0 <= r <= n <= 1,000,000
132-
val (n, r) = br.readLine().split(" ").map { it.toInt() }
133-
br.close()
151+
while (a * result <= m) {
152+
result += m;
153+
}
134154

135-
val factorial = LongArray(n + 1) { 0 }
136-
factorial[0] = 1L
137-
factorial[1] = 1L
138-
for (i in 2..n) {
139-
factorial[i] = (i * factorial[i - 1]) % p
140-
}
155+
return `${result > 1_000_000_000 ? "IMPOSSIBLE" : result}\n`;
156+
};
141157

142-
val result = factorial[n] * expdiv(factorial[r] * factorial[n - r] % p, p - 2) % p
158+
for (let i = 1; i <= t; i++) {
159+
// K: 참가자 수
160+
// C: 한 봉지에 들어있는 사탕의 개수
161+
// 1 <= K, C <= 1_000_000_000
162+
const [K, C] = input[i].split(" ").map(Number);
143163

144-
bw.write("$result")
145-
bw.flush()
146-
bw.close()
164+
// (C * x) mod K = 1
165+
answer += modInverse(C, K);
147166
}
148167

149-
fun expdiv(n: Long, e: Int): Long {
150-
return when (e) {
151-
0 -> 1
152-
1 -> n
153-
else -> {
154-
val temp = expdiv(n, e / 2)
155-
if (e % 2 == 0) (temp * temp) % p else (((n * temp) % p) * temp) % p
156-
}
157-
}
158-
}
168+
console.log(answer.trim());
159169
```
160170

161171
- <a href="https://www.acmicpc.net/problem/14565" target="_blank">14565번: 역원(Inverse) 구하기</a>

0 commit comments

Comments
 (0)