CF1151C 题解
思路
根据等差数列求和公式,。所以对于求 (前 个数的和),我们只要枚举每一轮,统计奇偶共有几个数并直接求和即可。最后求 个数,只需要差分求 即可。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
const ll mod = 1e9 + 7;
ll l, r;
int i;
ll f (ll x) {
ll sum1 = 0, sum2 = 0;
for (i = 0; i < 63; x -= 1ll << i, ++ i)
if (1ll << i > x) {
if (i & 1)
sum2 += x;
else
sum1 += x;
break ;
} else if (i & 1)
sum2 += 1ll << i;
else
sum1 += 1ll << i;
sum1 %= mod, sum2 %= mod;
return (sum1 * sum1 + sum2 * (sum2 + 1)) % mod;
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> l >> r;
cout << ((f (r) - f (l - 1)) % mod + mod) % mod;
return 0;
}

浙公网安备 33010602011771号