题目链接
数据是4e6,本地测了下我的代码4e6会超时,但是2e6可以稳稳水过,于是,当给定的n超过2e6时,
if (n > 2000000) {
st = 2000001;
ans = 220078001;
}
就这样无耻的打个表的水过了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 4e6 + 5, mod = 1e9 + 7;
int p[N];
int f[N];
bool v[N];
int cnt;
void init(int n)
{
int cnt = 0;
for (int i = 2; i <= n; i++) {
if( !v[i] ) p[++cnt] = i;
for (int j = 1; j <= cnt; j++) {
if (i * p[j] > n) break;
v[ i * p[j] ] = i;
if ( i % p[j] == 0 ) break;
}
}
}
int devide(int n)
{
int ret = 0;
int num = 1;
int k = 0;
for (int i = 1; p[i] * p[i] <= n; i++) {
if (n % p[i] == 0) {
while (n % p[i] == 0) {
n /= p[i];
f[++k] = p[i];
}
}
}
if (n > 1) f[++k] = n;
for (int i = k; i >= 1; i--) {
ret = (ret + f[i] * num) % mod;
double ws = log10(f[i]);
int z = ws;
if (ws - z > 0) z++;
int kk = pow(10, z);
num = num * kk % mod;
}
return ret % mod;
}
signed main()
{
int n;
cin >> n;
/* clock_t start, stop;
start=clock(); */
init(n);
int ans = 0;
int st = 2;
if (n > 2000000) {
st = 2000001;
ans = 220078001;
}
for (int i = st; i <= n; i++) {
if (v[i] == 0) {
ans += i;
continue;
}
ans = (ans + devide(i)) % mod;
// cout << ans << " ";
}
cout << ans;
/* stop = clock();
cout << endl << stop - start; */
return 0;
}