๐Ÿ”’Algorithm

๋ฐฑ์ค€ [nodejs] > 1629๋ฒˆ ๊ณฑ์…ˆ

devWarrior 2024. 11. 17. 10:14

 

 

๋ฌธ์ œ

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));