[SWEA] 5607.[Professional] ์กฐํฉ (python)
๐๋ฌธ์
๐ช์์ด๋์ด
์กฐํฉ ๊ณ์ฐ
์กฐํฉ๊ด๋ จ ๋ฌธ์ ์ด๋ฏ๋ก ํํ ๋ฆฌ์ผ์ ๊ตฌํํ๋ ค๊ณ ํ์๋ค. python์๋ combination๊ฐ์ ๊ณ์ฐํ๋ math.comb(n,r)ํจ์๊ฐ ์์ด์ ์ฌ์ฉํ๋ คํ์์ง๋ง n์ ์ต๋๊ฐ์ด 1e6์ด์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ํ๋ฌ๋ค. ๊ทธ๋์ ์ง์ ํํ ๋ฆฌ์ผ์ ๊ตฌํํด์ผํ๋ค.factorial ๊ตฌํ
$Combination(n,r) = \frac{n!}{(n-r)!r!}$ ์ ๊ตฌํํด์ผ ํ๊ธฐ์ ์ฒ์์๋ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์๋ค.
1
2
3
def fact(n):
if n==0 or n==1: return 1
return n * fact(n-1)
์ฌ๊ท ํธ์ถ์ ๊น์ด ์ ํ์ผ๋ก ์ธํ์ฌ ์คํ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ฌ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค. ๊ทธ๋์ ๋ฐ ์ฝ๋์ ๊ฐ์ด memorization๋ฅผ ์ฌ์ฉํ์ฌ ํํ ๋ฆฌ์ผ ๊ฐ์ ๊ณ์ฐํ์๋ค.
1
2
3
4
arr = [1, 1]
def fact(n):
for i in range(2, n+1):
arr.append(arr[-1] * i)
ํ
์คํธ์ผ์ด์ค๋ง๋ค ํํ ๋ฆฌ์ผ๋ฐฐ์ด์ ๊ตฌํ๋ ๊ฒ์ ์ค๋ณต๋ ๊ณ์ฐ์ ์ํํ๊ฒ ๋์ด ๋นํจ์จ์ (O(T*n))์๋ค. ๊ทธ๋์ ํ
์ด์ค์ผ์ด์ค๋ฅผ ์
๋ ฅ๋ฐ์ ์ต๋๊ฐ์ ์ฐพ๊ณ ์ต๋๊ฐ๋งํผ์ ํํ ๋ฆฌ์ผ๋ฐฐ์ด์ ๊ตฌํ์ฌ ์ฌ์ฌ์ฉํ์๋ค.(ํ๋ฒ๋ง ํํ ๋ฆฌ์ผ๋ฐฐ์ด์ ์ฐพ์ผ๋ฉด ๋ชจ๋ ๊ฐ์ ๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.(O(n)))
๐ฅ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
arr = [1, 1]
def fact(n):
for i in range(2, n+1):
arr.append((arr[-1] * i) % 1234567891)
T = int(input())
li = []
max_val = 0
for i in range(1, T+1):
n, r = map(int, input().split())
max_val = max(n, r, max_val)
li.append((n, r))
fact(max_val)
for i, val in enumerate(li):
a, b = val
answer = (arr[a] * pow((arr[a-b] * arr[b]) % 1234567891, 1234567889, 1234567891)) % 1234567891
print('#{} {}'.format(i+1, answer))
Comments powered by Disqus.