반응형
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>//max min을 위함
using namespace std;
long long npr = 1;
int main()
{
int N, M;
int T;//테스트케이스 개수
int top, bottom;//nPr n=top,r=bottom
cin >> T;
for (int i = 0; i < T; i++)
{
cin >> N >> M;
top = max(N, M);
bottom = min(N, M);
if ((top - bottom) >= bottom)
{
int temp = top;
while (top > (temp - bottom))
{ npr *= top;
top--;
}
for (int i = 1; i <= bottom; i++)
{
npr /= i;
}
}
else
{
int temp = top - bottom;
while (top > bottom)
{
npr *= top;
top--;
}
for (int i = 1; i <= temp; i++)
npr /= i;
}
cout << npr<<endl;
npr = 1;
}
}
for문으로 n!하고 r!나누고, (n-r)!나눠주면 되겠지! 하고 돌려보니 값이 longlong으로 커버가 안된다.
따라서 두가지 경우의 수로 나누어야한다
(n-r)>r 일때 or r>(n-r)일때 로 구분하여 n!을 계산 할 때 최소한의 값만 곱하여 자료형의 초기화를 미연에 방지하였다.
이후 나머지 펙토리얼을 나눠주며 출력하면 끝
반응형
'백준(알고리즘)' 카테고리의 다른 글
백준 11057 오르막 수 (0) | 2020.12.19 |
---|---|
백준 1309 동물원 (0) | 2020.12.19 |
백준 1932 정수삼각형 (0) | 2020.11.14 |
백준 1541 (0) | 2020.09.25 |
백준 2839 설탕배달 (0) | 2020.09.16 |