LightOJ 1005 Rooks(组合数学)

题目链接: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;

 }

  

你可能感兴趣的:(OO)