자연수 N과 정수 K가 주어졌을 때 이항 계수 C(N,K)를 1,000,000,007로
나눈 나머지를 구하는 프로그램을 작성하시오.
예제 입력 #1
5 2 #답 10
import sys
sys.stdin = open('./input.txt', 'r')
N, K = map(int, input().split())
p = 1000000007
arr = [[0 for _ in range(K+1)] for _ in range(N+1)]
def cef(N, K):
if K == 0 or N==K:
arr[N][K] = 1
if K == 1:
arr[N][K] = N
if arr[N][K] == 0:
arr[N][K] = cef(N-1, K) + cef(N-1, K-1)
return arr[N][K]
ans = cef(N,K)
print(ans%p)
이런식으로 구현했지만 값이 10만 이상이 된다면 이 코드를 적용할 수 없음
따라서 페르마의 소정리를 따라야함
이런 개념을 적용시키면
import sys
sys.stdin = open('./input.txt', 'r')
N, K = map(int, sys.stdin.readline().split())
p = 1000000007
def factorial(N):
n = 1
for i in range(2, N+1):
n = (n * i) % p
return n
def square(n, k):
if k == 0:
return 1
if k == 1:
return n
tmp = square(n, k//2)
if k % 2:
return tmp * tmp * n % p
else:
return tmp * tmp % p
#페르마의 소정리와 식이 같음 n! * (r!(n-r)!)^p-2 % p
print(factorial(N) * square(factorial(N-K) * factorial(K) % p, p-2) % p)
계속해서 p를 나눠주는 이유 => 페르마의 소정리 적용했기 때문