HDU2068 错排

#include<cstdio>
//错排公式f(0)=1;
__int64 a[15]={1,0,1,2};
int C_n_m(int n,int m)
{
__int64 u=1,d=1;
if(m>n/2)m=n-m;
for(int i=0;i<m;++i)
{
u*=(n-i);
d*=(i+1);
}
return u/d;
}
int main()
{
int n;
for(int i=4;i<15;++i)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);
}
while(~scanf("%d",&n),n)
{
__int64 sum=0;
for(int i=0;i<=(n/2);++i)
{
sum+=(C_n_m(n,i)*a[i]);
}
printf("%I64d ",sum);
}
return 0;
}

原文地址:https://www.cnblogs.com/-Unc/p/4232056.html