这部分涉及的知识为组合数和错排 ,参考http://blog.csdn.net/jiahui524/article/details/6624977
比较简单
hdu2068
#include
#include
__int64 C(int n,int m) //组合数公式
{
__int64 u,d,i; //组合数公式中的 分子u和分母d
if(m>n/2) m=n-m; //防止溢出
for(u=d=i=1;i<=m;i++)
{
u=u*(n-i+1);
d=d*i;
}
return u/d;
}
main()
{
int i,M,N;
__int64 f[14]={1,0,1},sum;
for(i=3;i<=13;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
while(scanf("%d",&N),N)
{
for(sum=i=0;i<=N/2;i++)
sum+=C(N,N-i)*f[i];
printf("%I64d\n",sum);
}
}
另一题,非常相似,上面的代码给一点点的改动
hdu 2049
#include
#include
__int64 C(int n,int m)
{
__int64 u,d,i;
if(m>n/2) m=n-m;
for(u=d=i=1;i<=m;i++)
{
u=u*(n-i+1);
d=d*i;
}
return u/d;
}
main()
{
int i,M,N,T;
__int64 f[21]={1,0,1},sum;
for(i=3;i<=20;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
// for(sum=i=0;i<=N/2;i++)
// sum+=C(N,N-i)*f[i];
printf("%I64d\n",C(N,M)*f[M]);
}
}