一如既往的水题
排列组合+错排
#include <cstdio>
#include <cstring>
using namespace std;
#define N 16
__int64 C_n_m(int n,int m) //组合排列
{
__int64 up,down;
int i;
up=down=1;
if(m==0) return 1; //
if(m>n/2) m=n-m; //防止溢出
for(i=0;i<m;i++)
{
up=up*(n-i);
down=down*(i+1);
}
return up/down;
}
int main()
{
int n,i;
__int64 sum;
__int64 f[N]={0,0,1,2};
for(i=4;i<14;i++) //错排公式
f[i]=(i-1)*(f[i-1]+f[i-2]);
while(scanf("%d",&n),n)
{
sum=1; //全部正确
for(i=1;i<=n/2;i++) //i个人错排
{
sum+=f[i]*C_n_m(n,i);
// printf("%I64d %I64d\n",f[i],C_n_m(n,i));
}
printf("%I64d\n",sum);
}
return 0;
}