๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 13172 - pow ์—ฐ์‚ฐ (๋ถ„ํ• ์ •๋ณต ๊ฑฐ๋“ญ์ œ๊ณฑ, ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›)

by huis_log 2025. 7. 14.

๋ฌธ์ œ ์š”์•ฝ

m๊ฐœ์˜ (n, s) ์Œ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์Œ์€ n๋ฉด์ฒด ์ฃผ์‚ฌ์œ„ ๊ตด๋ ค์„œ s๊ฐ€ ๋‚˜์˜ฌ ํ™•๋ฅ ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋˜๊ณ , ๊ฒฐ๊ตญ s/n ๊ฐ’์„ ๋‹ค ๋”ํ•ด์„œ mod 10^9+7๋กœ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์†Œ๋ฆฌ๋‹ค. ๋ฌธ์ œ ์ž์ฒด๋Š” ๊ทธ๋ƒฅ ๊ธฐ๋Œ“๊ฐ’๋“ค์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ผ๋Š” ๋ง์ฒ˜๋Ÿผ ์ƒ๊ฒผ์ง€๋งŒ, ์ •์ˆ˜ ๋‚˜๋ˆ—์…ˆ์— mod ์—ฐ์‚ฐ ๋“ค์–ด๊ฐ„ ์ˆœ๊ฐ„ ์–˜๊ธฐ๋Š” ๋‹ฌ๋ผ์ง„๋‹ค. ์ด๊ฑด ๋ฌด์กฐ๊ฑด ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์› ๋ฌธ์ œ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฑฐ๋‹ค.

์ ‘๊ทผ ๋ฐฉ์‹

s / n mod MOD๋Š” ๊ณง s * n^-1 mod MOD๋กœ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ n^-1์€ ์—ญ์›์ธ๋ฐ, MOD๊ฐ€ ์†Œ์ˆ˜๋‹ˆ๊นŒ ๊ทธ๋ƒฅ n^(MOD-2) mod MOD๋กœ ๊ตฌํ•˜๋ฉด ๋๋‚œ๋‹ค. ์ด๊ฑด ํŽ˜๋ฅด๋งˆ ์†Œ์ •๋ฆฌ ๊ณต์‹ ๊ทธ๋Œ€๋กœ ์“ด ๊ฑฐ๊ณ , ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ๋ถ„ํ• ์ •๋ณต ๊ฑฐ๋“ญ์ œ๊ณฑ ์จ์•ผ ํ•œ๋‹ค. pow ํ•จ์ˆ˜ ์“ฐ๋ฉด ๋˜์ง€๋งŒ ์—ฐ์Šตํ•˜๋ ค๋ฉด ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋„ ๋œ๋‹ค. ๋ถ„ํ• ์ •๋ณต ๋ฌธ์ œ์ด๋‹ˆ ๋งŒํผ ์ด ๋ถ€๋ถ„์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์ดํ•ดํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

์ฃผ์˜ํ•  ์ 

๊ณฑ์…ˆํ•  ๋•Œ๋„ mod ์ฒ˜๋ฆฌ ์•ˆ ํ•˜๋ฉด ๊ฐ’ ํ„ฐ์ง„๋‹ค. ๋ˆ„์ ํ•ฉ ๋”ํ•  ๋•Œ๋„ mod ๊ฑธ์–ด์ค˜์•ผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ„๋‹ค. pow ํ•จ์ˆ˜๋Š” ์–ธ์–ด์— ๋”ฐ๋ผ ์—†์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ง์ ‘ ์งœ๋Š” ์—ฐ์Šต ํ•ด๋‘๋Š” ๊ฒŒ ์ข‹๊ณ , ํŒŒ์ด์ฌ์€ ๊ทธ๋ƒฅ pow(a, b, mod) ์“ฐ๋ฉด ๋น ๋ฅด๊ณ  ๊น”๋”ํ•˜๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…

์ •์ˆ˜ ๋‚˜๋ˆ—์…ˆ์— mod ๋“ค์–ด์˜ค๋ฉด ๋ฌด์กฐ๊ฑด ๋ชจ๋“ˆ๋Ÿฌ ์—ญ์›์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ณ , MOD๊ฐ€ ์†Œ์ˆ˜์ผ ๋•Œ๋งŒ ํŽ˜๋ฅด๋งˆ ์†Œ์ •๋ฆฌ ์จ์„œ ์—ญ์› ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ถ„ํ• ์ •๋ณต ๊ฑฐ๋“ญ์ œ๊ณฑ์€ a๋ฅผ ์ œ๊ณฑํ•˜๋ฉด์„œ b๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์ด๊ณ , b์˜ ๋น„ํŠธ๊ฐ€ 1์ผ ๋•Œ๋งŒ ๊ทธ ์ˆœ๊ฐ„์˜ a๋ฅผ ๊ฒฐ๊ณผ์— ๊ณฑํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๊ฑธ๋กœ O(log b)์— ์•ˆ์ „ํ•˜๊ฒŒ ์ง€์ˆ˜ ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•˜๋‹ค.


# dac, python ์‹ค์ „์—์„œ๋Š” (a**b)%mod ์—ฐ์‚ฐ์—์„œ๋Š” pow(a,b,mod) ํ™œ์šฉ
import sys
input=sys.stdin.readline

# pow(a,b,mod) ์—ฐ์‚ฐ์˜ ์ง์ ‘ ๊ตฌํ˜„. ์—ฌ๊ธฐ์„œ ๋ถ„ํ• ์ •๋ณต์ด ์‚ฌ์šฉ
def mod_pow(a,b,mod):
    result=1
    a%=mod
    while b>0:
        if b%2==1:
            result=(result*a)%mod
        a=(a*a)%mod
        b//=2
    return result

def mod_cal(n,s,mod):
    b=mod_pow(n,mod-2,mod)
    a=s
    return (a*b)%mod

def main():
    m=int(input().strip())
    mod=10**9+7
    result=0
    for _ in range(m):
        n,s=map(int,input().split())
        result=(result+mod_cal(n,s,mod))%mod
    print(result)
    
if __name__=="__main__":
    main()
๋ฐ˜์‘ํ˜•