hani_verse :: aim_higher
article thumbnail

์•ˆ๋…•ํ•˜์„ธ์š” aim_higher ์ž…๋‹ˆ๋‹ค.

๋ฐฑ์ค€ 13977๋ฒˆ : ์ดํ•ญ ๊ณ„์ˆ˜์™€ ์ฟผ๋ฆฌ ์ฝ”๋“œ๋ฆฌ๋ทฐ์ž…๋‹ˆ๋‹ค.


Baekjoon Online Judge 11758๋ฒˆ: CCW

https://www.acmicpc.net/problem/13977

  • Number Theory(์ •์ˆ˜๋ก )

๋ฌธ์ œ๊ฐ€ ์ •๋ง ์งง๋„ค์š”. nCk๋ฅผ 1,000,000,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๊ฐ€ ์ด M๊ฐœ(M ≤ 100,000), N๊ณผ K๊ฐ€(N ≤ 4,000,000, K ≤ N)์œผ๋กœ ์ฃผ์–ด์ง€๋ฏ€๋กœ

์ผ๋ฐ˜์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” TLE๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค


ํ•ด๊ฒฐ๊ธฐ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค

์šฐ์„ , ์˜›๋‚ ์— ๋ฐฐ์› ๋˜ ์กฐํ•ฉ์˜ ์„ฑ์งˆ์„ ๋”๋“ฌ์–ด๋ณด๋ฉฐ ๋‹ค์Œ์˜ ์‹์„ ๋– ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

nCr = n! / r! * (n-r)!

nCr์ด ๋ชจ๋‘ x! ์™€ ๊ฐ™์€ ํŒฉํ† ๋ฆฌ์–ผ์˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

N์˜ ๋ฒ”์œ„(N ≤ 4,000,000)๊นŒ์ง€ x! / MOD ๊ฐ’์„ ๋ฏธ๋ฆฌ ๊ตฌํ•ด ๋†“๊ณ  ์œ„์˜ ์‹๋Œ€๋กœ ๊ณฑํ•˜์ž๋Š” ์ƒ๊ฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ r!*(n-r)!์€ ์—ญ์ˆ˜ ํ˜•ํƒœ๋ผ MOD๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ทจํ•˜๋ฉด ์•ˆ๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค...

๊ทธ๋Ÿฌ๋ฉด ๋‚˜๋ˆ—์…ˆ์ด ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ ๊ณฑ์…ˆ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ์š”?

 

์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด "ํŽ˜๋ฅด๋งˆ์˜ ์†Œ์ •๋ฆฌ" ์ž…๋‹ˆ๋‹ค.

$$a^{\rho}\equiv1(\bmod\rho)$$

์ด ์ˆ˜ํ•™์‹์„ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด

$$a^{\rho-1} \text{% } \rho =1$$

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์–‘๋ณ€์„ a๋กœ ๋‚˜๋ˆ„๋ฉด

$$a^{\rho-2} \text{% } \rho =a^{-1}$$

์šฐ๋ณ€์˜ \(a^{-1}\) ์—ญ์ˆ˜๊ผด์„ ์ขŒ๋ณ€์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

a์— r!*(n-r)!์„ ๋Œ€์ž…ํ•˜๊ณ , p์— MOD(1,000,000,007)์„ ๋Œ€์ž…ํ•˜๋ฉด

$$(r!*(n-r)!)^{MOD-2} \text{% } MOD =(r!*(n-r)!)^{-1}$$

์ด์™€ ๊ฐ™์ด ์ง€์ˆ˜ ๊ณฑ์…ˆ ํ˜•ํƒœ๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค.

์ง€์ˆ˜ ๊ณฑ์…ˆ์€ ๋‹ค์Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ll powExp(ll a, ll x){
    if (x == 1) return a % MOD;
    if (x % 2) return powExp(a, x - 1) * a % MOD;
    return powExp(a * a % MOD, x / 2);
}

ํ•ต์‹ฌ์€ ์ง€์ˆ˜๊ฐ€ ์ง์ˆ˜์ผ๋•Œ ๋ฐ˜์œผ๋กœ ์ชผ๊ฐœ์„œ ์žฌ๊ท€๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค

์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ์ง๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด O(logN)์ž…๋‹ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ์–ผ ์ „์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ–ˆ์œผ๋‹ˆ ์ง€์ˆ˜๊ณฑ์…ˆ์— ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ํŒฉํ† ๋ฆฌ์–ผ์€ O(1)

 

์š”์•ฝํ•˜์ž๋ฉด ์กฐํ•ฉ ๊ณต์‹ + ํŽ˜๋ฅด๋งˆ์˜ ์†Œ์ •๋ฆฌ + ์ง€์ˆ˜ ๊ณฑ์…ˆ ์ž…๋‹ˆ๋‹ค.

์œ„ ์„ธ๊ฐ€์ง€๋ฅผ ์ž˜ ๊ธฐ์–ตํ•ด์„œ ๋” ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”์„ ๋•Œ ์‘์šฉํ•ด๋ด…์‹œ๋‹ค.

profile

hani_verse :: aim_higher

@aim_higher

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!