题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068
此题考查错排公式,组合数运算,正确的数目用组合,错误的情况用错排。
错排公式为:F(n)=(n-1)*(F(n-1)+F(n-2));
F(1)=0;F(2)=1;……
AC 代码为:
#include<iostream> using namespace std; __int64 a[13]={0,0,1};//只需要定义到a[13]即可,因为最大为25 void fun() { for(int i=3;i<=12;i++) a[i]=(i-1)*(a[i-1]+a[i-2]); } int cnm(int n,int m) { int s=1; for(int i=1;i<=m;i++) s=s*(n--)/i; return s; } int main() { //freopen("d:\\1.txt","r",stdin); fun(); int n; while(scanf("%d",&n)!=EOF&&n) { __int64 s=0; //__int64类型 if(n<=3)cout<<1<<endl; //小于4的情况不适合下面的情况 else { for(int i=(n+1)/2;i<=n-2;i++)//直到算到错排为2的情况 不存在错排为1的 { s+=(cnm(n,i)*a[n-i]); } printf("%I64d\n",s+1);//错排为0的情况为1种 即全对的情况 } } return 0; }