阶乘二进制表示末尾1的位置
题目描述
给定一个非负整数N,如果用二进制数表达N!的结果,返回最低位的1在哪个位置上,认为最右的位置为位置0。
输入描述:
第一行一个整数N。
输出描述:
输出一个整数表示答案
示例1
输入
1
输出
0
说明
1! = 1,最低位的1在0位置上
示例2
输入
2
输出
1
说明
2 != 2,最低位的1在1位置上
示例3
输入
1000000000
输出
999999987
备注:
1 ⩽ N ⩽ 1 0 18 1 \leqslant N \leqslant 10^{18} 1⩽N⩽1018
题解:
与阶乘末尾 0 的个数相似,最低位的 1 出现在哪个位置,取决于 1~N 的数中有多少个因子 2 ,因为每出现一个因子 2 ,最低位的 1 都会左移一位。
代码:
#include <cstdio>
using namespace std;
typedef long long LL;
int main(void) {
LL n;
scanf("%lld", &n);
LL ret = 0;
while ( n ) {
ret += n / 2;
n >>= 1;
}
return 0 * printf("%lld\n", ret);
}
博客围绕阶乘二进制表示末尾1的位置展开。给定非负整数N,求N!二进制结果中最低位1的位置,最右为位置0。题解指出,该位置取决于1到N的数中因子2的个数,每出现一个因子2,最低位1左移一位。

322

被折叠的 条评论
为什么被折叠?



