题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1005
题意:在一个n*n的棋盘上放m个车,使得各个车之间不相互攻击。有多少种放法?
思路:先在n行中选出m行,C(n,m),再在n列中选出m列随便放A(n,m),答案为C(n,m)*A(n,m)。
#include <iostream>
#include <cstdio>
#include <cstring>
#define int64 long long
using namespace std;
int n,m,num=0,c;
int64 A(int n,int m)
{
int64 ans=1;
int i;
for(i=n-m+1;i<=n;i++) ans*=i;
return ans;
}
int64 C(int n,int m)
{
int64 ans=1;
int i;
for(i=1;i<=m;i++)
{
ans=ans*(n-i+1)/i;
}
return ans;
}
int main()
{
for(scanf("%d",&c);c--;)
{
scanf("%d%d",&n,&m);
int64 ans;
if(n<m) ans=0;
else ans=C(n,m)*A(n,m);
printf("Case %d: %lld\n",++num,ans);
}
return 0;
}