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
24 21000 500
Sample Output
16
思路分析:
因为n ≤ m≤1000,所以m!的结果过大会溢出,所以先得出组合数再化为二进制的方法是行不通的。因此需要逐个计算。
进行简单归类后会发现,当某个数可以有多少个因子是2,它的二进制末尾就有多少个0;因此在循环计算组合时可以逐个求出可以有多少因子是2 。
代码:
#include<iostream>
using namespace std;
int main() {
int m, n, a, T, j, i, b, k;
cin>>T;
for(i = 0; i < T; i++) {
a = b = 0;
cin>>m>>n;
for(j = n+1; j <= m; j++) {
k = j;
while(k%2==0) {
k = k/2;
a++;
}
}
for(j = 1; j <= m-n; j++) {
k = j;
while(k%2==0) {
k = k/2;
b++;
}
}
cout<<a-b<<endl;
}
return 0;
}