原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068
参考1:错排公式讲解:https://blog.csdn.net/qq_18661257/article/details/47663825
参考2:题目代码:https://blog.csdn.net/qq_30076791/article/details/47679101
#include <iostream>
using namespace std;
__int64 num[26]; //错排i个元素的排列个数
__int64 C(int m, int n)
{
__int64 s=1;
for(int i=1,j=m; i<=n; i++,j--)
s*=j;
for(int i=1; i<=n; i++)
s/=i;
return s;
}
__int64 A(int n)
{
int s=1;
for(int i=1; i<=n; i++)
s*=i;
return s;
}
int main()
{
num[0]=1; //错排0个,即全部排对
num[1]=0;
num[2]=1;
for(int i=3; i<26; i++)
{
num[i]=(i-1)*(num[i-1]+num[i-2]);
}
int n;
while(scanf("%d",&n)&&n)
{
__int64 s=0;
for(int i=0; i<=n/2; i++)
s+=num[i]*C(n, i); //任取i个数错排
cout<<s<<endl;
}
return 0;
}