0. 이항계수란
- n개 중 k개를 뽑는 조합의 수

- 이항계수의 성질

1. n개 중에 k개를 뽑는 것과 n개 중에 n-k개를 뽑는 경우의 수는 같다
(뽑지 않을 것을 정하는 것과 뽑을 것을 정하는 것은 같다)

2. n-1개 중에 k개를 뽑는 경우의 수와(1개 포함X) n-1개 중에 k-1개를 뽑는 경우의 수(1개 포함O)를 더하면
n개 중에 k개를 뽑는 경우의 수이다

3. nC0부터 nCn까지의 합은 2^n 이다
1. 분할정복을 이용한 이항계수 구하기
1.1 알고리즘 진행과정

0️⃣ nC0 혹은 nCn 은 항상 1이다
1️⃣ 나머지 경우는 이항계수의 2번 성질을 활용하여 구현
시간복잡도가 O(n!)이라서 엄청나게 비효율적..
1.2 코드
def bino(n, k):
if k == 0 or n == k:
return 1
else:
return bino(n-1, k-1)+bino(n-1, k)
2. DP를 이용한 이항계수 구하기
2.1 알고리즘 진행과정

0️⃣ n과 k를 순회하면서! nC0 혹은 nCn인 경우 1 저장
1️⃣ 나머지 경우는 이항계수의 2번 성질을 활용하여 저장
시간복잡도 O(N^2)
2.2 점화식
memo[i][j] = memo[i-1][j-1] + memo[i-1][j]
2.3 코드
for i in range(1, n+1):
for j in range(k+1):
if i == j or j == 0:
memo[i][j] = 1
else:
memo[i][j] = memo[i-1][j-1]+memo[i-1][j]
3. 페르마의 소정리를 이용한 이항계수 구하기
3.0 페르마의 소정리란
![]()
a는 정수, p는 소수
a의 p승을 p로 나눈 나머지는 a를 p로 나눈 나머지와 같다
양변을 a로 나누면

3.1 알고리즘 진행과정
좀더 고민해보자.. (DP가 어디 범위까지 될지도 생각해보기)