hdoj 2068 RPG的错排

题目来源 http://acm.hdu.edu.cn/showproblem.php?pid=2068

错排+组合

错排见https://blog.csdn.net/Dear_Jia/article/details/82217803

题目source:hdoj 2068 RPG的错排
	题目大意:给n个元素n个位置,要求一半或以上的元素全部
对应编号位置,其他的全部错排
	解题思路:(组合+错排)任选从2(1没有错排)到一半错排,
其他的正确排列

#include<stdio.h>
__int64 arr[15]={0,0,1};
__int64 C(int n,int m){//求C(n,m)(从n个数中选m个组合) 
	__int64 a=1,b=1,i;
	for(i=1;i<=m;i++,n--){//一共需要循环m次,分子为n乘到n-m+1,分母为m的阶乘 
		b=b*i;
		a=a*n;
	} 
	return a/b;
}

int ErrA(){//错排公式 
	for(int i=3;i<=15;i++){
		arr[i]=(i-1)*(arr[i-1]+arr[i-2]);
	}
}

int main(){
	int n;
	ErrA();
	while(scanf("%d",&n)!=EOF&&n){
		__int64 ans=1;//猜错1个的时候就是猜错0个 
		for(int i=2;i<=n/2;i++){
			//printf("C(n,i)=%d arr[i]=%d\n",C(n,i),arr[i]);
			ans+=C(n,i)*arr[i];
		}
		printf("%I64d\n",ans);
	}
	return 0;
}
//WA原因:错排的数值很大,应该用long long类型 

猜你喜欢

转载自blog.csdn.net/Dear_Jia/article/details/82217780
今日推荐