문제
자연수 N과 정수 K가 주어졌을 때 이항 계수 (NK)를 10,007로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ K ≤ N)
출력
(NK)를 10,007로 나눈 나머지를 출력한다.
예제 입력 1
5 2
예제 출력 1
10
<접근>
코딩을 처음 입문하면 재귀함수를 호출하여 시간이 오래걸리는 방법을 썻지만, dp를 이용하여 빠르게 구한다.
이항계수를 배우면 파스칼 삼각형을 당연히 떠올리게 된다.
보면 가로로 연속하는 두개의 숫자의 합이 첫째와 둘째숫자의 중간 숫자 임을 알 수 있다.
따라서 다음이 성립한다.
n C k = n-1 C k-1 + n-1 C k
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int arr[a+1][a+1]={0,};
for(int i=0;i<=a;i++) //맨위가 1이고 이는 쓸모 없는 0번째 인덱스라서 arr[a][]까지
for(int j=0;j<=i;j++){
if(i==j||j==0)
arr[i][j]=1;
else
arr[i][j]=(arr[i-1][j-1]%10007+arr[i-1][j]%10007)%10007;
}
cout<<arr[a][b];
}
5,2를 예시로 출력해보면 다음과 같이 나온다.
'알고리즘 > 백준 BOJ 문제풀이' 카테고리의 다른 글
백준 9465번 : 스티커 (C++) (0) | 2021.04.08 |
---|---|
백준 13305 : 주유소 (0) | 2021.03.22 |
백준 2563 : 색종이 (0) | 2021.03.19 |
백준 1932 : 정수 삼각형 (0) | 2021.03.15 |
백준 1748 : 수 이어쓰기 1 (C++) (0) | 2021.03.09 |