#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7, inf = 0x3f3f3f3f;
ll quickpow(ll x, ll k)
{
ll res = 1;
while(k){
if(k & 1) res = (res * x) % mod;
k >>= 1, x = (x * x) % mod;
}
return res;
}
const int maxn = 2e6;
unordered_map<ll,ll> mii;
ll inv2, inv6;
ll sum1(ll l, ll r)
{
return (l + r) % mod * ((r - l + 1) % mod) % mod * inv2 % mod;
}
ll sum2(ll x)
{
return x % mod * ((x + 1) % mod) % mod * ((2 * x + 1) % mod) % mod * inv6 % mod;
}
ll prime[maxn + 10], phi[maxn + 10], sieve[maxn + 10], mem[maxn + 10];
//线性筛
void init()
{
prime[1] = phi[1] = 1;
int cnt = 0;
for (int i = 2; i <= maxn; ++i){
if (!prime[i]) phi[i] = i - 1, sieve[++cnt] = i;
for (int j = 1; j <= cnt && i * sieve[j] <= maxn; ++j){
prime[i * sieve[j]] = 1;
if (i % sieve[j] == 0){
phi[i * sieve[j]] = phi[i] * sieve[j];
break;
}else{
phi[i * sieve[j]] = phi[i] * (sieve[j] - 1);
}
}
}
//注意修改前缀和形式!!!
for (ll i = 2; i <= maxn; ++i){
phi[i] = i * i % mod * phi[i] % mod + phi[i - 1];
phi[i] %= mod;
}
}
ll S(ll n)
{
if (n <= maxn) return phi[n];
if (mii.count(n)) return mii[n];
ll res = sum1(1, n) * sum1(1, n) % mod;
for(ll l = 2, r; l <= n; l = r + 1) {
r = n / (n / l);
res -= (sum2(r) - sum2(l - 1)) * S(n / l);
res %= mod;
}
if (res < 0) res += mod;
return mii[n] = res;
}
ll get(ll n)
{
ll res = 0;
for(ll l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
res += sum1(l, r) * S(n / l);
res %= mod;
}
return res;
}
int main()
{
init();
inv2 = quickpow(2, mod - 2);
inv6 = quickpow(6, mod - 2);
ll n;
scanf("%lld", &n);
ll ans = get(n);
printf("%lld\n", ans);
return 0;
}
08-17
265
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-13
687
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-09
1337
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)