天天看點

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]);
	}
}
           
下一篇: 最簡單的bfs