【组合数学】棋盘上放车(C++)

Description
在一个N*N的棋盘上,放上K个中国象棋中的车,要求它们互不攻击
问有多少种合理的摆法.
(1<=N<=10,0<=K<=N*N)

Input
N,K

Output
方案数

Sample Input

4 4

Sample Output

24 

HINT










首先画出图:
在这里插入图片描述
这种情况就可以用1234表示,那么这题就被转换成了1234的全排列问题。
这是这个样例,再想:若输入是6 4怎么办?那么就是相当于1234的全排列再乘C(n,k),这个C(n,k)是n个里取k个的意思,那么有了这个思路,就好写了。

注:C(n,k)=n!/(n-k)!/k!

下面是代码:

#include<bits/stdc++.h>
using namespace std;
long long jc(int n)//阶乘
{
    long long sum=1;
    for(int i=1;i<=n;i++)
        sum*=i;
    return sum;
}
long long P(int m,int n)//排列数公式
{
    return jc(m)/jc(m-n);
}
long long C(int n,int m)//组合数公式
{
    return jc(n)/jc(n-m)/jc(m);
}
int main() {
    int n,k;
    cin>>n>>k;
    cout<<P(n,k)*C(n,k)<<endl;
  
    return 0;
}
原创文章 75 获赞 126 访问量 1万+

猜你喜欢

转载自blog.csdn.net/liuzich/article/details/103538991