제목 설명
재생 공원에 M 아이가, 티켓은 $ 1입니다. 상기 아이 밴드 돈 N $ 1, $ 2 돈을 K 아이입니다. 도체는 변경이 아이들의 대부분은 항상 변화를 찾고 도체 열려 총을 줄 방법을 물어 보지 않았다. 참고 : 두 아이, 자신의 위치를 교환하는 위안 변화를 가지고는 새 행 방법으로 간주 될 수있다. (M <= 10)
기입
입력 라인, M, N, K (여기서, M = N + K, M <= 10).
수출
출력 라인, 총 큐잉 방식.
샘플 입력
4 2
샘플 출력
8
첫째, 우리는 알 수 있습니다 :
1. 개최 덜 $ 1 개 어린이는 어린이의 수는 $ 2 보유 수보다 다음이 확실히입니다 경우 해결책이 없다.
2. M == 0, 즉 아무도 티켓을 구입하지시기 경우없는 해결책 중.
3. 따라서, 단지 논의는 N> = K (긍정 해결의 가능성) :는
계산을 통해 다수의 논문은 규칙 수득 요약 될 수있다 :
을 고려하지 않고 ( 두 아이, 위안화 변화를 얻을 자신의 위치를 교환, 새 행 방법으로 간주 될 수있다. 경우)이 경우, 우리는 재귀 적으로 배열 된 결과 결과를 얻을 수 있습니다.
그러나 문제는 (즉, N! 그리고 K가!), 그리고 결과 곱한 우리가 그의 전체 배열을, N을 계산 K 그 상황을 고려 우리를 필요로한다.
최종 결과 ( ! X N! X K 결과 )에 직접 출력한다.
다음과 같이 코드입니다 :
#include<iostream>
#include<algorithm>
#include<vector>
#include<bits/stdc++.h>
using namespace std;
int paixu_num = 0;
void getNUM(int remain_N, int remain_K, int linQian) {//remain_N 持有1元的数 remain_K 持有2元的数 linQian 1元零钱数
if (remain_N == 0 || remain_K == 0) {//其中一个为零后,剩余那种直接摆在末尾就行了
paixu_num++;
return;
}
else if (linQian > 0) {
getNUM(remain_N - 1, remain_K, linQian + 1);
getNUM(remain_N, remain_K - 1, linQian - 1);
}
else {//零钱没有了,只能先让1元的孩子买票,使得售票员获得零钱
getNUM(remain_N - 1, remain_K, linQian + 1);
}
}
int pl(int n) {//得到n的阶乘
int num = 1;
for (int i = 1; i <= n; i++) {
num *= i;
}
return num;
}
int main() {
int M, N, K; //N-1,K-2,M = N+K<=10
cin >> M >> N >> K;
if (N < K || M == 0) {// 两种无解的情况 要先排除
cout << 0;
}
else {//因为上面排除N<K的情况了,所以肯定有解
getNUM(N, K, 0);
cout << paixu_num * pl(N) * pl(K);
}
return 0;
}