在组合数学中,我们学过排列数。

排列与二进制(暑假每日一题 33)_数据 个不同元素中取出 排列与二进制(暑假每日一题 33)_整除_02个元素的所有排列的个数,叫做从 排列与二进制(暑假每日一题 33)_数据 中取 排列与二进制(暑假每日一题 33)_数论_04 的排列数,记为 排列与二进制(暑假每日一题 33)_约数_05

具体计算方法为 排列与二进制(暑假每日一题 33)_约数_06(规定 排列与二进制(暑假每日一题 33)_数据_07)。

排列与二进制(暑假每日一题 33)_数据排列与二进制(暑假每日一题 33)_数论_04 不是很小时,这个排列数是比较大的数值,比如 排列与二进制(暑假每日一题 33)_进制_10

如果用二进制表示为 排列与二进制(暑假每日一题 33)_数据_11,也就是说,最后面有 排列与二进制(暑假每日一题 33)_进制_12

我们的问题就是,给定一个排列数,算出其二进制表示的后面有多少个连续的零。

输入格式
输入包含多组测试数据。

每组数据占一行,包含两个整数 排列与二进制(暑假每日一题 33)_整除_13

最后一行为 ​​0 0​​,表示输入结束,无需处理。

输出格式
每组数据输出一行,一个结果,表示排列数 排列与二进制(暑假每日一题 33)_约数_05

数据范围
排列与二进制(暑假每日一题 33)_数论_15
输入最多包含 排列与二进制(暑假每日一题 33)_进制_16

输入样例:

10 5
6 1
0 0

输出样例:

5
1

  • 排列与二进制(暑假每日一题 33)_数据_17 进制时,要求数的右边有几个排列与二进制(暑假每日一题 33)_整除_18,就是求数有几个因子排列与二进制(暑假每日一题 33)_数据_17
    同理二进制就是求数有几个因子 排列与二进制(暑假每日一题 33)_数论_20
  • 如何求排列与二进制(暑假每日一题 33)_约数_21 中有几个因子 排列与二进制(暑假每日一题 33)_数据_22
    排列与二进制(暑假每日一题 33)_约数_23
    等价于求 排列与二进制(暑假每日一题 33)_数据_24
    排列与二进制(暑假每日一题 33)_进制_25 求的是 排列与二进制(暑假每日一题 33)_整除_26 中能被 排列与二进制(暑假每日一题 33)_数据_22 整除的数的个数
    排列与二进制(暑假每日一题 33)_进制_28 求的是 排列与二进制(暑假每日一题 33)_整除_26 中能被 排列与二进制(暑假每日一题 33)_约数_30 整除的数的个数
    而能被p^2整除的数 包含有 排列与二进制(暑假每日一题 33)_数论_20排列与二进制(暑假每日一题 33)_数据_22 的因子
    但是这些数也是 排列与二进制(暑假每日一题 33)_数据_22 的倍数,所以在 排列与二进制(暑假每日一题 33)_进制_25 时已经加了一遍
    此时只需要 排列与二进制(暑假每日一题 33)_进制_35 即可。
    其它的同理
#include<iostream>

using namespace std;

int f(int n, int p){

int res = 0;
while(n) res += n / p, n /= p;
return res;
}

int main(){

int n, m;
while(cin >> n >> m, n)
cout << f(n, 2) - f(n - m, 2) << endl;

return 0;
}