#include <bits/stdc++.h>
using namespace std;
const int N = 1E7 + 5;
const int MOD = 1E9 + 7;
const int ni2 = MOD / 2 + 1;
const int ni6 = 166666668;
long long n3, n2, n1, n0, nx, sx, m, ans, sum, r, t, f[N];
void updata(long long& a, long long b) { a = (a + b % MOD + MOD) % MOD; }
long long add(long long x, long long k) {
  long long n = (m - x + 1) % MOD;
  x %= MOD;
  updata(n2, n * n * k);
  updata(n1, n * k);
  updata(n0, k);
  updata(sx, x * k);
  updata(nx, n * x * k);
  return ((n * n % MOD * n - n) % MOD * ni6 % MOD +
          (n * n + n) % MOD * x % MOD * ni2 % MOD) *
         k;
}
void change() {
  updata(nx, n1 * t % MOD - sx * t % MOD - n0 * t % MOD * t % MOD);
  updata(n2, -2 * n1 * t % MOD + n0 * t % MOD * t % MOD);
  updata(n1, -n0 * t % MOD);
  updata(sx, n0 * t % MOD);
}
int main() {
  cin >> m;
  for (r = 1; r * r <= m; r++) updata(f[0], add(r * r, 1));
  r--;
  ans = f[0];
  for (long long i = 1; i * i <= m; i++) {
    f[i] = f[i - 1];
    for (; r * r + i * i > m; r--)
      updata(f[i], add(r * r + (i - 1) * (i - 1), -1));
    t = i * i - (i - 1) * (i - 1);
    updata(f[i], (n1 * t % MOD * t % MOD - n2 * t % MOD) % MOD * ni2 % MOD +
                     n0 * (t - t * t % MOD * t % MOD) % MOD * ni6 % MOD);
    updata(f[i], ((n1 + n2 - sx - 2 * nx) % MOD * t % MOD +
                  (sx - 2 * n1 - n0) % MOD * t % MOD * t % MOD +
                  n0 * t % MOD * t % MOD * t % MOD) *
                     ni2 % MOD);
    change();
    updata(ans, f[i]);
  }
  ans = ans * 4 % MOD;
  updata(ans, add(0, 1));
  cout << ans;
}
