提交时间:2024-11-12 13:35:37

运行 ID: 34620

#include <cmath> #include <iostream> using namespace std; using i64 = long long; using i128 = __int128_t; constexpr int MOD = 1e9 + 7, INV_2 = 500000004; #define SQ(X) ((i64)(X) * (X)) #define min(X, Y) ((X) < (Y) ? (X) : (Y)) #define max(X, Y) ((X) > (Y) ? (X) : (Y)) inline int div(i64 x) { return ((i128)x * 1152921497) >> 60; } inline int mod(i64 x) { return x - div(x) * MOD; } inline int add(int x, int y) { return mod((unsigned)x + y + MOD); } template <class T> inline int mul(T x, T y) { return mod((i64)(x % MOD) * (y % MOD)); } inline int halve(int x) { return mul(x, INV_2); } inline int sum(i64 l, i64 r) { return halve(mul(r + l, r - l + 1)); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); i64 l, r; int ans = 0; cin >> l >> r; for (int i = sqrt(l); SQ(i - 1) <= r; ++i) { i64 lst = SQ(i - 1), curr = SQ(i), nxt = SQ(i + 1), lo = curr - ((curr - lst) >> 1), hi = curr + ((nxt - curr) >> 1); if (hi < l || lo > r) continue; lo = max(lo, l); hi = min(hi, r); ans = add(ans, (curr & 1 ? 1 : -1) * sum(lo, hi)); } cout << ans << '\n'; return 0; }