문제설명
숫자 N과 K를 입력받고 두 수의 이항계수를 10007로 나눈 나머지를 출력하는 문제입니다.
작동 순서
1. 두 수를 입력받습니다.
2. N과 K의 이항계수는 N!/(K!*(N-K)!이므로 N!, K!, (N-K)!을 구합니다.
3. 팩토리얼 수를 구할 때 시간을 단축하기 위해 메모이제이션을 활용합니다.
4. 이항계수를 구하면 10007로 나누고 나머지를 출력합니다.
소스코드
import sys
sys.setrecursionlimit(10000000)
memo = [0, 1, 2] + [0]*998
def factorial(num):
if memo[num] != 0:
return memo[num]
else:
memo[num] = num*factorial(num-1)
return memo[num]
n, r = map(int, input().split())
if r == 0 or r == n:
print("1")
else:
print((factorial(n)//(factorial(r)*factorial(n-r))) % 10007)
후기
이항계수1과 다른 점은 입력되는 수의 범위과 커진 것밖에 없어서 그렇게 어렵지 않게 풀 수 있었습니다. 하지만 다른 사람들의 풀이를 보니 전혀 달느 방법으로 푼 사람이 많던데 똑같은 문제를 풀 때도 다양한 풀이를 활용할 수 있도록 공부해야 할 것 같습니다.