您的位置:首页 > 其它

hdu2049(组合数学)

2014-06-02 17:24 483 查看
题意:每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓衣板...假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.

解法:从N中选出M个C
[m],然后乘上错排公式;f
=(n-1)*(f[n-1]+f[n-2]);f[0]=1;f[1]=0;

代码:
/******************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;

#define eps 1e-8
const double pi=acos(-1.0);
typedef long long LL;
const int Max=25;
const int INF=1000000007;

LL f[Max];
LL C[Max][Max];
void init()
{
f[1]=0;
f[0]=1;
for(int i=2;i<Max;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
for(int i=0;i<Max;i++)
for(int j=0;j<=i;j++)
C[i][j]=j?C[i-1][j-1]+C[i-1][j]:1;
}

int main()
{
init();
int t;cin>>t;
while(t--)
{
int n,m;scanf("%d%d",&n,&m);
cout<<C
[m]*f[m]<<'\n';
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: