题意: 从 n*n 的棋盘中放置 K 个 行和列不冲突的棋子
思路: 组合数学, 先选 k 个 行, k 个列, 就是 C(n,k) ^ 2;
然后 K 个棋子不相同, K ! 全排列
#includeusing 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;}