hdu2068 & hdu 2049 错排组合

这部分涉及的知识为组合数和错排 ,参考http://blog.csdn.net/jiahui524/article/details/6624977

 

比较简单

 

hdu2068

 

#include<stdio.h>
#include<math.h>

__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<stdio.h>
#include<math.h>

__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]);
	}
}


 

 

 

 

 

你可能感兴趣的:(c)