Description
在一个n*n的棋盘中放置k个车,使得这k个车互相不攻击,一共有多少种放法(两车互相不攻击的条件为两车不在同一行且不在同一列)。
Input
多组测试数据,每组测试数据包含两个正整数n,k(1<=n<=10,1<=k<=n*n)。
Output
对于每组测试数据输出一个整数代表一共有几种放法。
Sample Input
4 4
Sample Output
24
思路
假设在一个n*n的棋盘中放n个车,则一共有n!种方法.
但题意要求是放k个车,那么可以先想在放前k-1个车时,共有几种放法
再考虑最后一个车有几种放法
代码
#include<stdio.h>
typedef long long LL;
int main()
{
LL n,k;
while(~scanf("%lld%lld",&n,&k))
{
LL ans=1;
int c=0,p=1;
for(int i=n;i>=1;i--)
{
if(p==k)
{
ans*=n*n-c;
break;
}
else
ans*=i;
c+=2*i-1; p+=1;
}
if(k>n)
printf("0\n");
else
printf("%lld\n",ans);
}
return 0;
}