C. Johnny and Another Rating Drop
https://codeforces.com/problemset/problem/1362/C
题意:给定一个数n∈[0, 1e18],求每两个相邻的数的不同bit位数量的总和
思路:要找规律,发现相邻的两个数都是在最低的bit位上增加一,那么相邻的两个数最低位永远不同。那第二位应该是每两次比较就会出现一次不同,第三位应该是四次比较出现一次不同。得出公式:对于第i位,有(1ll << i)个数比较时,会有一次的bit不同。
总结:第一天没想出来,第二天才写出来的。这种题型没见过,但是可以知道是规律题,所以只能硬着头皮找规律了。。
inline void solve(){
long long n;
cin >> n;
long long ans = 0;
for (int i = 0; i < 64; ++i) {
long long cur = (1ll << i);
ans += (n / cur);
}
cout << ans << '\n';
}