Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34603 | 23级逯一鸣 | 【S】T1 | C++ | 解答错误 | 9 | 177 MS | 590068 KB | 1403 | 2024-11-12 12:52:37 |
#include <algorithm> #include <cmath> #include <cstdio> #include <tuple> #include <vector> using namespace std; using i64 = long long; constexpr int MOD = 1e9 + 7, INV_2 = 500000004; #define SQ(X) ((i64)(X) * (X)) inline int add(int x, int y) { return (x + y + MOD) % MOD; } inline int mul(i64 x, i64 y) { return (x % MOD) * (y % MOD) % MOD; } inline int div_2(i64 x) { return mul(x, INV_2); } inline int sum(i64 l, i64 r) { return div_2(mul(l + r, r - l + 1)); } inline int sgn(i64 x) { return x > 0 ? 1 : (x < 0 ? -1 : 0); } int main() { // freopen("alice.in", "r", stdin); // freopen("alice.out", "w", stdout); i64 l, r; vector<tuple<i64, i64, int>> segs; scanf("%lld %lld", &l, &r); for (int i = sqrt(l); SQ(i) <= r; ++i) { i64 lst = SQ(i - 1), curr = SQ(i), nxt = SQ(i + 1); segs.emplace_back(curr - ((curr - lst) >> 1), curr + ((nxt - curr) >> 1), curr & 1 ? 1 : -1); } int ans = 0, len = segs.size(); for (int i = 0; i < len; ++i) { i64 lo = get<0>(segs[i]), hi = get<1>(segs[i]); int sign = get<2>(segs[i]); if (hi < l || lo > r) continue; lo = max(lo, l); hi = min(hi, r); ans = add(ans, sign * div_2(mul(lo + hi, hi - lo + 1))); } printf("%d\n", ans); return 0; }