๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ๊ณผ Modular Inverse
ย - Last update: 2023-11-11

๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ๊ณผ Modular Inverse

์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ์ˆ˜๋ฅผ NN ์ œ๊ณฑํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ O(N)O(N) ์ด์ง€๋งŒ, ๊ฐ„๋‹จํ•œ ์ˆ˜ํ•™์œผ๋กœ ์ด๋ฅผ O(logโกN)O(\log N)์— ๋งˆ์น  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฑฐ๋“ญ์ œ๊ณฑ ํ•˜๊ณ ์ž ํ•˜๋Š” ์ˆ˜๋ฅผ ์ด์ง„์ˆ˜๋กœ ๋ณด๊ณ , binary lifting ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, aa์˜ 1313 ์ œ๊ณฑ์„ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ด๋Š” ์ด์ง„์ˆ˜๋กœ 1101(2)1101_{(2)}์ด๋ฏ€๋กœ,

  • 11 ์ œ๊ณฑ ํ•œ ์ˆ˜
  • 44 ์ œ๊ณฑ ํ•œ ์ˆ˜
  • 88 ์ œ๊ณฑ ํ•œ ์ˆ˜

๋ฅผ ๋ชจ๋‘ ๊ณฑํ•˜๋ฉด ๋œ๋‹ค. 2n2^n ์ œ๊ณฑ ํ•œ ์ˆ˜๋Š” ๊ฐ™์€ ์ˆ˜๋ฅผ ๋‘๋ฒˆ ๊ณฑํ•จ์œผ๋กœ์จ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•ด์ง„๋‹ค. (88์ œ๊ณฑํ•œ ์ˆ˜๋Š” 44์ œ๊ณฑํ•œ ์ˆ˜๋ฅผ ๋‘๋ฒˆ ๊ณฑํ•˜๋ฉด ๋œ๋‹ค)

๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. apa^p๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๋ฏ€๋กœ, MOD๋กœ ๋‚˜๋จธ์ง€๋งŒ ๋“ค๊ณ ๋‹ค๋‹ˆ๋„๋ก ๋งŽ์ด ๊ตฌํ˜„ํ•˜๋Š” ํŽธ.

ll fpow(ll a, ll p) {
ll res = 1LL;
while (p) {
if (p & 1LL) res = res * a % MOD;
a = a * a % MOD;
p >>= 1LL;
}
return res;
}

Modular Inverse

์˜ค์ผ๋Ÿฌ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, pp๊ฐ€ ์†Œ์ˆ˜์ผ ๋•Œ, nโˆ’1=npโˆ’2n^{-1} = n^{p-2}๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์‹ค์ˆ˜์˜ค์ฐจ ๋•Œ๋ฌธ์— ์งœ์ฆ๋‚˜๋Š” ๋ถ„์ˆ˜๋ฅผ ์‹ ๋‚˜๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์•ณ์ฝ”๋”์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์†Œ์ˆ˜ pp๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ์œ„์˜ ๋น ๋ฅธ ๊ฑฐ๋“ญ์ œ๊ณฑ ๊ณต์‹๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ๋ฐฑ์ค€ ๋ฌธ์ œ์— ์™œ ์ด ๋ฐฉ์‹์„ ์“ฐ๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

ll getInv(ll v) {
return fastPow(v, MOD - 2);
}

Time Complexity

  • O(logโกN)O(\log N). ์ผ์ข…์˜ Binary Lifting ์ด๋‹ค.
๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: