题目连接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=30303
题意:
从m个不同元素中取出n (n ≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下:
C(m, n) = m!/((m - n)!n!)
现在请问,如果将组合数C(m, n)写成二进制数,请问转这个二进制数末尾有多少个零。
案例:
input:
2
4 2
1000 500
output:
1
6
思路分析:
因为n ≤ m≤1000,所以m!的结果过大会溢出,所以先得出组合数再化为二进制的方法是行不通的。因此需要逐个计算。
进行简单归类后会发现,当某个数可以有多少个因子是2,它的二进制末尾就有多少个0;因此在循环计算组合时可以逐个求出可以有多少因子是2 。
先将才组合数的计算公式化简,可得结果为n+1到m的乘积除以1到m-n的乘积,再对分母进行循环求出可以有多少因子是2,得出a,同时对分子也进行循环求出可以有多少因子是2,
得出b,最后用分母的因字数减去分子的因字数,输出a-b。
源代码如下:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int m,n,a,T,j,i,b,k; 6 cin>>T; 7 for(i=0;i<T;i++) 8 { 9 a=0;b=0; 10 cin>>m>>n; 11 for(j=n+1;j<=m;j++) 12 { 13 k=j; 14 while(k%2==0) 15 { 16 k=k/2; 17 a++; 18 } 19 } 20 for(j=1;j<=m-n;j++) 21 { 22 k=j; 23 while(k%2==0) 24 { 25 k=k/2; 26 b++; 27 } 28 } 29 cout<<a-b<<endl; 30 } 31 return 0; 32 }