是错排加组合。也可以看下hdu 2048.
关键的是公式:f(i)=(i-1)[f(i-1)+f(i-2)];
然后 从1个到n/2个进行组合。 可以看下错排公式
注意点:1、不需要求出f(25),其实只需要到f(13)就行了。。
2、注意排列组合的计算,不能直接按公式做,因为中间过程越界了。
#include <iostream>
using namespace std;
__int64 c(int n,int m) //排列组合函数
{
__int64 i,t1=1,t2=1;
for(i=n;i>=n-m+1;i--)
t1=t1*i;
for(i=1;i<=m;i++)
t2=t2*i;
return t1/t2;
}
int main()
{
int n,i;
__int64 f[26]={1,0,1,2}; //注意和2048的不同。开始几个不能错啊
for(i=4;i<15;i++) //错排的结果
f[i]=(i-1)*(f[i-1]+f[i-2]);
while(cin>>n,n)
{
__int64 s=0;
for(i=0;i<=n/2;i++)
s=s+c(n,i)*f[i];
printf("%I64d\n",s);
}
}