#include #include #include using namespace std; typedef long long LL; typedef pair PII; const int N = 100010; struct Block { int l, r, frst_ele, c; LL sum; }; int p, q; PII pp[N]; vector blocks; LL ps[N]; vector ls, rs; LL Calc1(int id, int l, int r) { int ele = blocks[id].frst_ele, c = blocks[id].c, cl = blocks[id].l; int l_val = ele - c * (l - cl); int r_val = ele - c * (r - cl); return 1LL * (l_val + r_val) * (r - l + 1) / 2; } LL Calc2(int id, int pos, int op) { int ele = blocks[id].frst_ele, c = blocks[id].c, cr = blocks[id].r, cl = blocks[id].l; if (op == 0) { // 左块 int l_val = ele - c * (pos - cl); int r_val = ele - c * (cr - cl); if (c == 0) return 1LL * l_val * (cr - pos + 1); return 1LL * (l_val + r_val) * (cr - pos + 1) / 2; } else { int l_val = ele; int r_val = ele - c * (pos - cl); if (c == 0) return 1LL * l_val * (pos - cl + 1); return 1LL * (l_val + r_val) * (pos - cl + 1) / 2; } } LL Calc3(int lb, int rb) { return ps[rb] - ps[lb - 1]; } int main() { // freopen("mod.in", "r", stdin); // freopen("mod.out", "w", stdout); scanf("%d%d", &p, &q); for (int i = 1; i <= q; ++i) scanf("%d%d", &pp[i].first, &pp[i].second); int cl = 1; while (cl <= p) { int d = p / cl; // 商(公差) int cr = p / d; int first = p % cl; int last = p % cr; int c = (cl == cr ? 0 : d); LL sum = 1LL * (first + last) * (cr - cl + 1) / 2; blocks.push_back({ cl, cr, first, c, sum }); ls.push_back(cl); rs.push_back(cr); cl = cr + 1; } ps[0] = blocks[0].sum; for (int i = 1; i < blocks.size(); ++i) { ps[i] = ps[i - 1] + blocks[i].sum; } for (int i = 1; i <= q; ++i) { LL ans = 0LL; if (pp[i].second > p) { ans += 1LL * (pp[i].second - max(pp[i].first, p + 1) + 1) * p; pp[i].second = min(pp[i].second, p); } if (pp[i].first <= p) { int lb = upper_bound(ls.begin(), ls.end(), pp[i].first) - ls.begin() - 1; int rb = lower_bound(rs.begin(), rs.end(), pp[i].second) - rs.begin(); if (lb == rb) { ans += Calc1(lb, pp[i].first, pp[i].second); // 一个块内 } else { ans += Calc2(lb, pp[i].first, 0); // 最左块(部分) ans += Calc3(lb + 1, rb - 1); // 中间块(完整) ans += Calc2(rb, pp[i].second, 1); // 最右块(部分) } } printf("%lld\n", ans); } return 0; }