CSU1021组合数末尾的零

1021: 组合数末尾的零

Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 710     Solved: 478    

Description

m个不同元素中取出(≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下:

C(mn) = m!/((n)!n!) 

现在请问,如果将组合数C(mn)写成二进制数,请问转这个二进制数末尾有多少个零。

Input

第一行是测试样例的个数T,接下来是T个测试样例,每个测试样例占一行,有两个数,依次是mn,其中≤ ≤ 1000。

Output

分别输出每一个组合数转换成二进制数后末尾零的数量。

Sample Input

24 21000 500

Sample Output

16

Hint

Source

中南大学第四届大学生程序设计竞赛


对于任意一个数,只有它乘以2才能使它的二进制数后面多一个0

对于n!, 需要找出从1到n这些数中的所有数的二进制有多少个0,再加起来就行了


#include<cstdio> 
int p(int n)
{
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		int x=i;
		while(x)
		{
			if(x&1)	break;
			sum++;
			x>>=1;
		}
	}
	return sum;
}
int main()
{
	int n,m,t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&m);
		printf("%d\n",p(n)-p(n-m)-p(m));
	}
	return 0;
}





阅读更多
版权声明:听说这里是写版权声明的 https://blog.csdn.net/Hpuer_Random/article/details/79945464
上一篇CSU1112: 机器人的指令
下一篇CSU1022 菜鸟和大牛
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭