intqpow(int x, int y){ int res = 0; while (y) { if (y & 1) res *= x; x *= x; y >>= 1; } return res; } intlowbit(int x){ int res = 1; for (int i = 2; i <= x / i; i++) { int cnt = 0; while (x % i == 0) { x /= i; cnt++; } if (i == 2) res *= qpow(2, cnt); } if (x != 1) { if (x == 2) { res *= 2; } } return res; }
考虑优化,只需统计 $=2$ 的质因数即可,代码可以优化成这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
intqpow(int x, int y){ int res = 0; while (y) { if (y & 1) res *= x; x *= x; y >>= 1; } return res; } intlowbit(int x){ int cnt = 0; while (x % 2 == 0) { x /= 2; cnt++; } returnqpow(2, cnt); }
最后再使用位运算优化一下常数,代码就会变成这样:
1 2 3 4 5 6 7 8
intlowbit(int x){ int res = 0; while (!(x & 1)) { res++; x >>= 1; } return (1 << res); }