1021: 组合数末尾的零
题目:
Description
从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下:
C(m, n) = m!/((m - n)!n!)
现在请问,如果将组合数C(m, n)写成二进制数,请问转这个二进制数末尾有多少个零。
Input
第一行是测试样例的个数T,接下来是T个测试样例,每个测试样例占一行,有两个数,依次是m和n,其中n ≤ m≤ 1000。Output
分别输出每一个组合数转换成二进制数后末尾零的数量。
Sample Input
2
4 2
1000 500
Sample Output
1
6
思路:
一个十进制数如果是2的多少次方,它的二进制数末尾就有多少个零。
<1> 分别找出组合数分子,分母中含有2的个数count1,count2;
<2> 所求的末尾0的个数count=count1-count2;
注:如果求出组合数后再去求末尾有几个零会超内存;因为题目所要求的范围。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int t,m,n,i,count1,count2,count,x; 6 cin>>t; 7 while(t--) 8 { 9 count=0; 10 count1=0; 11 count2=0; 12 cin>>m>>n; 13 for(i=n+1;i<=m;i++) 14 { 15 x=i; 16 while(x%2==0) 17 { 18 count1++; 19 x=x/2; 20 } 21 } 22 for(i=m-n;i>=1;i--) 23 { 24 x=i; 25 while(x%2==0) 26 { 27 count2++; 28 x=x/2; 29 } 30 } 31 count=count1-count2; 32 cout<<count<<endl; 33 } 34 return 0; 35 }