์ผ๋ฐ์ ์ผ๋ก ํน์ ์๋ฅผ ์ ๊ณฑํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ด์ง๋ง, ๊ฐ๋จํ ์ํ์ผ๋ก ์ด๋ฅผ ์ ๋ง์น ์ ์๋ค. ์ด๋ ๊ฑฐ๋ญ์ ๊ณฑ ํ๊ณ ์ ํ๋ ์๋ฅผ ์ด์ง์๋ก ๋ณด๊ณ , binary lifting
ํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ์ ๊ณฑ์ ํ๊ณ ์ ํ๋ค๋ฉด, ์ด๋ ์ด์ง์๋ก ์ด๋ฏ๋ก,
๋ฅผ ๋ชจ๋ ๊ณฑํ๋ฉด ๋๋ค. ์ ๊ณฑ ํ ์๋ ๊ฐ์ ์๋ฅผ ๋๋ฒ ๊ณฑํจ์ผ๋ก์จ ๋น ๋ฅด๊ฒ ๊ตฌํด์ง๋ค. (์ ๊ณฑํ ์๋ ์ ๊ณฑํ ์๋ฅผ ๋๋ฒ ๊ณฑํ๋ฉด ๋๋ค)
๋ฐ๋ผ์ ์๋์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ ์์ฑ์ด ๊ฐ๋ฅํ๋ค. ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ธฐํ๊ธ์์ ์ผ๋ก ์ปค์ง๋ฏ๋ก, 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;}
์ค์ผ๋ฌ ๊ณต์์ ์ฌ์ฉํ๋ฉด, ๊ฐ ์์์ผ ๋, ๊ฐ ์ฑ๋ฆฝํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ์ค์์ค์ฐจ ๋๋ฌธ์ ์ง์ฆ๋๋ ๋ถ์๋ฅผ ์ ๋๊ฒ ๊ณ์ฐํ ์ ์๋ค. ์ณ์ฝ๋์์ ์์ฃผ ์ฌ์ฉํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฃผ์ด์ง๋ ์์ ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์, ์์ ๋น ๋ฅธ ๊ฑฐ๋ญ์ ๊ณฑ ๊ณต์๊ณผ ๊ฐ์ด ์ฌ์ฉํด์ผ ํ๋ค.
์๋ ๋ฐฑ์ค ๋ฌธ์ ์ ์ ์ด ๋ฐฉ์์ ์ฐ๋์ง ์์ธํ ์ค๋ช ๋์ด ์๋ค.
ll getInv(ll v) {return fastPow(v, MOD - 2);}