题目来源 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类型