1377: 象棋中的车
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 155 Solved: 63
[ Submit][ Status][ Web Board]
Description
在一个n*n的棋盘中放置k个车,使得这k个车互相不攻击,一共有多少种放法(两车互相不攻击的条件为两车不在同一行且不在同一列)。
Input
多组测试数据,每组测试数据包含两个正整数n,k(1<=n<=10,1<=k<=n*n)。
Output
对于每组测试数据输出一个整数代表一共有几种放法。
Sample Input
4 4
Sample Output
24
【解析】
这道题做了很久...数学太垃圾没办法..其实这道题就是排列组合,怎么说呢公式大概是这样子c(n,m)*n*(n-1)一直
到(n-m+1),因为是这样子的比如拿5行5列举个例子,任取3行,这样我们可以认为它有C(5,3)种可能,所以我们的
公式刚开始就是这个,之后呢因为如果我们取三个那每一行可以取的是这样子的比如5,3,第一行五个都可以取,第
二行只能取4个地方了,第三行只能取三个地方了,就是这样子的一个规律。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,m,sum,i,k,p,q;
while(~scanf("%d%d",&n,&m))
{
k=1;
q=1;
p=1;
if(n==m)
{
sum=1;
}
else
{
for(i=m+1;i<=n;i++)
k=k*i;
for(i=1;i<=n-m;i++)
p=p*i;
sum=k/p;
}
for(i=n;i>=n-m+1;i--)
q=q*i;
sum=sum*q;
printf("%d\n",sum);
}
return 0;
}