题意:
n行n列,放置k颗棋子的方案数,棋子不能放在同行同列
n行先拿出k行(无顺序)
(n!)(n−k)!∗k!
每行有n列 ,每列放一个(有顺序)
(n!)(n−k)!
两个分式相乘整理可得
((n!)(n−k)!)2∗1k!
dp[n][k] = dp[n-1][k-1] * n ^2 / k;
题意:
n行n列,放置k颗棋子的方案数,棋子不能放在同行同列
n行先拿出k行(无顺序)$$\frac{(n!)}{(n-k)!*k!}$$
每行有n列 ,每列放一个(有顺序)$$\frac{(n!)}{(n-k)!}$$
两个分式相乘整理可得$$\left(\frac{(n!)}{(n-k)!}\right)^2*\frac{1}{k!}$$
dp[n][k] = dp[n-1][k-1] * n ^2 / k;
#include <cstdio>
#include <cstring>
typedef long long ll;
ll dp[35][910];
int n,k;
void init()
{
for(int i = 1; i <= 35; i++)
{
dp[i][0] = 1;
dp[i][1] = i*i;
}
for(int i = 2; i <= 35; i++)
{
for(int j = 2; j <= i; j++)
{
dp[i][j] = dp[i][1] * dp[i-1][j-1] / j;
}
}
}
int main()
{
int test,cnt;
init();
cnt = 0;
scanf("%d", &test);
while(test--)
{
scanf("%d %d", &n, &k);
printf("Case %d: %lld\n", ++cnt, dp[n][k]);
}
return 0;
}