HDOJ2049(错排)

来源:互联网 发布:鼎捷软件怎么样 编辑:程序博客网 时间:2024/06/07 17:34

N对新婚夫妇,M对找错,其实就是现在N里面选出M,也就是C(N,M),然后考虑M对夫妇,全都选不到自己的配偶的情况(错排):

M[i]=(n-1)(M[i-1]+M[i-2])

推理如下:

假设A B C D 四个人

假设A先选错,那他有3种选择(即n-1种)

A B C D

*  A  *  *

如果B也选择了A,那么问题转化成 n-2规模的

如果B不选择A,那么转化成n-1规模的(因为B不选A,可以将A看成A')   


/*HDOJ2049作者:陈佳润2013-04-08*/#include<iostream>using namespace std;int c(int n,int k){int i,sum=1,kk;kk=2;for(i=1;i<=k;i++){sum*=n;n--;while(sum%kk==0&&kk<=k){sum/=kk;kk++;}}return sum;}int main(){int i,t,a,b;__int64 num[21];num[0]=1;num[1]=0;num[2]=1;for(i=2;i<=20;i++)num[i]=(i-1)*(num[i-1]+num[i-2]);cin>>t;while(t--){cin>>a>>b;printf("%I64d\n",c(a,b)*num[b]);}return 0;}


原创粉丝点击