728x90
https://www.acmicpc.net/problem/11401
11401번: 이항 계수 3
자연수 \(N\)과 정수 \(K\)가 주어졌을 때 이항 계수 \(\binom{N}{K}\)를 1,000,000,007로 나눈 나머지를 구하는 프로그램을 작성하시오.
www.acmicpc.net
1. 코드 설명
- 이항 계수를 구하는 공식이다. 범위가 4,000,000이라서 일반적인 공식으로는 풀기 불가능
- 페르마의 소정리를 활용한 코드, 확장 유클리드 호제법의 두가지 방식으로 풀 수 있다.
- 페르마의 소정리 - p가 소수이고 a가 p의 배수가 아니면 a^(p-1)의 p로 나눈 나머지는 1이다.
- 유클리드 호제법 - 자연수 a,b가 주어졌을 때, a와 b의 최대 공약수를 구하는 방법. - gcd(a,b)
- 확장 유클리드 호제법 - 정수해를 갖는 부정 방정식 ax+by=c 이 주어질 때, 이 방정식을 만족하는 (x,y)값을 구할 수 있다.
2. 예
3. 코드
# 분할 정복을 이용하여 a^b를 구한다.
def fermat(a, b):
if b == 0:
return 1
if b % 2:
return (fermat(a, b//2) ** 2 * a) % p
else:
return (fermat(a, b //2) ** 2) % p
p = 1000000007
n, k = map(int, input().split())
# nCk를 나타내기 위해 팩토리얼을 dp로 구해줍니다.
factorial = [1 for _ in range(n+1)]
for i in range(2, n+1):
factorial[i] = factorial[i-1] * i % p
# A는 nCk의 분자가되고 B는 분모가 됩니다.
A = factorial[n]
B = (factorial[n - k] * factorial[k]) % p
print((A % p) * (fermat(B, p - 2) % p) % p)
728x90
'Programming > python' 카테고리의 다른 글
백준 2110 : 공유기 설치 [파이썬] (0) | 2023.02.07 |
---|---|
백준 6549 : 히스토그램에서 가장 큰 직사각형 [파이썬] (0) | 2023.02.06 |
백준 2630 : 색종이 만들기 [파이썬] (0) | 2023.02.01 |
백준 11729 : 하노이 탑 이동 순서 (0) | 2023.01.17 |
백준 24060 : 알고리즘 수업 - 병행정렬 [파이썬] (0) | 2023.01.16 |