๋ฌธ์
https://www.acmicpc.net/problem/1629
ํ์ด
js์์ BigInt๋ฅผ ๋ง์ด ๋ค๋ค๋ณด์ง ์์์ ๊ต์ฅํ ์์ํด์ ๋ง์ด ๋ฒ๋ฒ ๊ฑฐ๋ ธ๋ค.
BigInt๋ 2^53-1๋ฅผ js ๋ด์์ ๋ค๋ฃฐ ์ ์๋ ๋ด์ฅ๊ฐ์ฒด์ด๋ค. ์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ผ ํ๋ค. ์๋ํ๋ฉด
์ฃผ์ด์ง A,B,C ์ ๋ฒ์๊ฐ 2,147,483,647 ์ดํ์ด๊ธฐ ๋๋ฌธ์ 2,147,483,647์ ์ ๊ณฑ์น๋ง ๋๋ ์ด๋ฏธ BigInt๋ฅผ ๋ค๋ค์ผ ํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด์ ํต์ฌ์ ๋ค์๊ณผ ๊ฐ๋ค
1. (A * B) % C = ((A%C) * (B%C))%C ์ด๋ค
-> ์๋ฐ์คํฌ๋ฆฝํธ์์ ํฐ์ซ์์ ์ฐ์ฐ๋ณด๋จ ์์์ซ์์ ์ฐ์ฐ ์๋๊ฐ ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ด์ฉํ์ฌ ๋๋จธ์ง๋ค์ ๊ณฑํ๋๊ฒ ์๋์ฐจ์์์ ์ข๋ค
2. 2^10 ์ ๊ตฌํ๊ธฐ ์ํด 2๋ฅผ 10๋ฒ ๊ณฑํ๊ธฐ๋ณด๋จ (9๋ฒ์ ์ฐ์ฐํ์) 2^5์ ๊ตฌํ๋ค 2^5๋ฅผ 2๊ฐ ๊ณฑํ์! (5๋ฒ์ ์ฐ์ฐํ์)
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim();
let [A, B, C] = input.split(" ").map((n) => BigInt(n));
let recursive = (pow) => {
if (pow === 1n) {
return A % C;
}
let newPow = pow / 2n;
let half = recursive(newPow) % C;
if (pow % 2n === 0n) {
return (half * half) % C;
} else {
return (half * half * (A % C)) % C;
}
};
let answer = recursive(B);
console.log(Number(answer));
'๐Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค[node.js] > 15650๋ฒ ์ ์ถ (0) | 2024.11.21 |
---|---|
๋ฐฑ์ค[node.js] > 1966๋ฒ ์ ์ถ (0) | 2024.11.20 |
๋ฐฑ์ค [node.js] > 1916๋ฒ ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ (1) | 2024.11.16 |
๋ฐฑ์ค[node.js] > 11660๋ฒ ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ5 (0) | 2024.11.14 |
๋ฐฑ์ค[nodejs] > 9465๋ฒ ์คํฐ์ปค (1) | 2024.11.13 |