Untitled

 avatar
unknown
plain_text
a year ago
1.4 kB
7
Indexable
#include <bits/stdc++.h>

using namespace std;

const int MOD = 1e9 + 7;

int numQuery;
long long n;

int prod(long long a, long long b) {
    return 1LL * (a % MOD) * (b % MOD) % MOD;
}

int sum(long long n) {
    long long a[2] = {n, n + 1};
    a[n % 2] /= 2;
    return prod(a[0], a[1]);
}

int subtask2(long long n, int lim = -1) {
    if (lim < 0) {
        lim = n;
    }
    long long result = (n + 1) % MOD;
    for (int d = 1; d <= lim; d++) {
        int r = n % d;
        long long k = n / d;
        result += prod(r + 1, k);
        result += prod(sum(k - 1), d);
        result %= MOD;
    }
    return result;
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    freopen("treedis.inp", "r", stdin);
    freopen("treedis.out", "w", stdout);

    cin >> numQuery;
    while (numQuery--) {
        cin >> n;
        long long answer = 0;
        const int R = sqrt(n);
        answer += subtask2(n, R);
        for (int l = 2; l <= n / R; l++) {
            long long dmax = n / (l - 1);
            if (dmax <= R) {
                continue;
            }
            answer += prod(n, (dmax - R));
            answer -= prod(l - 1, sum(dmax) - sum(R) + MOD);
            answer += dmax - R;
            answer %= MOD;
        }
        if (answer < 0) {
            answer += MOD;
        }
        cout << answer << '\n';
    }

    return 0;
}
Editor is loading...
Leave a Comment