題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2068
解題思路:如題所示,就是錯排。
#include <cstdio>
#include <cstring>
using namespace std;
long long a[15],c[30][30];
int main()
{
a[1]=a[0]=0;
a[2]=1;a[3]=2;
for(int i=4;i<=12;++i)
a[i]=(a[i-1]+a[i-2])*(i-1);
memset(c,0,sizeof(c));
for(int i=1;i<=25;++i)
c[i][1]=i,c[i][0]=1;
for(int i=2;i<=25;++i)
for(int j=1;j<=i;++j)
c[i][j]=c[i-1][j-1]+c[i-1][j];
int n;
while(scanf("%d",&n),n)
{
int k=(n+1)>>1;
long long ans=1;
for(int i=k;i<=n;++i)
ans+=c[n][i]*a[n-i];
printf("%lld\n",ans);
}
return 0;
}