1. 程式人生 > >hdoj 2068 RPG的錯排

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型別