因数平方和 - 蓝桥云课 (lanqiao.cn)
#include <bits/stdc++.h>
#define x first
#define y second
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef pair<int,int> PII;
typedef pair<char,int> PCI;
typedef long long LL;
typedef unsigned long long ULL;
const int N=1e6+10 , INF = 0x3f3f3f3f ,mod =1e9 + 7 ;
int n;
LL qmi(LL a,LL b)
{
LL res =1;
while(b)
{
if(b &1) res = (res* a ) % mod;
a = a * a % mod;
b >>=1;
}
return res;
}
LL sum(LL x)// sum = x * (x+1) * (2*x+1) /6 = 1^2 + 2^2 +...+x^2
{
return x%mod *(x+1) % mod *(x*2 + 1) % mod * qmi(6,mod-2) % mod;
}
int get(int x)// 满足 n 除以 一段区间里的数 的区间右端点
{
return n/(n/x);
}
void solve()
{
cin>>n;
LL ans =0;
for(int l=1,r;l<=n;l=r+1)
{
r = min(get(l),n);// 找到这个区间的右端点
ans = (ans + (n/l) * (sum(r) - sum(l-1)) % mod + mod ) % mod ;
// n/l: n中里有 n/l 个 l
// sum(r) - sum(l-1) [l,r]这段区间的 平方和
// n/l == n/r
}
cout << ans << endl;
}
int main()
{
ios
int T=1;
// cin>>T;
while(T -- )
{
solve();
}
return 0;
}