题意:N*N的棋盘放K个车,一个车所在的行列不能有第二个车,求有多少种放法。
思路:简单组合数学,如果K>N则不可能放下。K<=N有C(N,K)*C(N,K)*K!
表示从N行中选K行,从N列中选K列,然后全排列。
#include <bits/stdc++.h>
using namespace std;
long long C[40][40];
void init ()
{
for (int i = 1; i <= 31; i++)
{
for (int j = 1; j <= i; j++)
{
if (i==1 || i==j)
C[i][j] = 1;
else
C[i][j] = C[i-1][j] + C[i-1][j-1];
}
}
}
int main(void)
{
int T, cas=1;
scanf("%d", &T);
init();
while (T--)
{
int n, k;
long long ans = 0;
scanf("%d %d", &n, &k);
if (k<=n)
{
ans = C[n+1][k+1]*C[n+1][k+1];
for (long long i = 1; i <= k; i++)
ans*=i;
}
printf("Case %d: %lld\n", cas++, ans);
}
return 0;
}