Assembly Level
์์ ๊ฐ์ฅ ๋๋ฆฐ Arithmetic ์ฐ์ฐ์ ๊ผฝ์ผ๋ผ๊ณ ํ๋ค๋ฉด, modular
์ฐ์ฐ์ผ ๊ฒ์ด๋ค. ๋ณดํต PS์์๋ ๋๋์
์ฐ์ฐ์ด ์์๊ฐ์ด ๋์ค์ง ์๋๋ก ํ๊ธฐ ์ํด์ modular ์ฐ์ฐ์ ํ ๊ฐ์ ์ถ๋ ฅํ๋๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ์ด ๊ฒฝ์ฐ ์ผ๋จ modular ์ฐ์ฐ ์์ฒด๋ฅผ ์ค์ด๋๊ฒ ์ฒซ๋ฒ์งธ๊ณ , ๋์ ํ ์๋ ๊ฒฝ์ฐ ์ฐจ์ ์ฑ
์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ modular ์ฐ์ฐ์ ๊ณฑ์
๊ณผ if ๋ถ๊ธฐ๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ค. ๋จ, modular๋ฅผ ์ํํ ๊ฐ์ ๋ฏธ๋ฆฌ ์๊ณ ์์ด์ผ ํ๋ค. (์ฆ, MOD
๊ฐ ๊ณ์ ๋ฐ๋๋ฉด ์๋๋ค.) ๋ํ, ์ด MOD๋ 32๋นํธ ์๋ฃํ ์์ ๋ค์ด๊ฐ ์ ์๋ ์๋ฃํ์ด์ด์ผ ํ๋ค๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ , ๋นํธ์ฐ์ฐ์ ํ์ฉํ๋ ๊ธฐ๋ฒ์ด๊ธฐ ๋๋ฌธ์ 128๋นํธ ์๋ฃํ์ด ์ ์ ์ฌ์ฉ๋๋ค. MSVC์์๋ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒ์ด๋ค.
constexpr ll MOD = 1000000007;constexpr ll IMOD = 0xFFFFFFFFFFFFFFFF / MOD + 1;inline ll modular(ull n) {ull x = ull((__uint128_t(n) * IMOD) >> 64);unsigned int r = n - x * m;return m <= r ? x - 1 : x;}
์ค์ ๋ก ์ฌ์ฉํ ๋๋
a = b % MOD;
์ ์ฝ๋๊ฐ
a = modular(b);
๊ฐ ๋ ๊ฒ์ด๋ค. ๋ฌผ๋ก ์๋์ ๋งํ ๊ฒ์ฒ๋ผ IMOD ๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐ๋์ด ์์ด์ผ ํ๋ค.
๋๋ผ์ด ์ ์ ํจ์ ์์ ๋ชจ์์ด ์ ๋ ๊ฒ ๋ณต์กํ๋ฐ๋ ์ผ๋ฐ modular ์ฐ์ฐ๋ณด๋ค ๋น ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค๋ ๊ฒ..