题意: 从 n*n 的棋盘中放置 K 个 行和列不冲突的棋子
思路: 组合数学, 先选 k 个 行, k 个列, 就是 C(n,k) ^ 2;
然后 K 个棋子不相同, K ! 全排列
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL Num[40][40];
void Init()
{
Num[0][0] = 1;
for(int i = 1; i <= 30; ++i)
{
Num[i][0] = Num[i][i] = 1;
Num[i][1] = i;
for(int j = 2; j < i; ++j)
Num[i][j] = Num[i-1][j] + Num[i-1][j-1];
}
}
int main()
{
Init();
int t, n, k;
cin >> t;
for(int kase = 1; kase <= t; ++kase)
{
cin >> n >> k;
LL ans = 0;
if(k <= n) {
ans = Num[n][k] * Num[n][k];
for(LL i = 1; i <= k; ++i)
ans = ans * i;
}
printf("Case %d: %lld\n",kase, ans);
}
return 0;
}