70pts, Wa 三个点
看了许久不知道是哪里挂掉了
求助喵
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
typedef long long ll;
const int NN = 1e5 + 10, mod = 1e9 + 7, iv6 = (mod + 1) / 6;
inline int inc(int x, int y) { return (x += y) < mod ? x : x - mod; }
inline int dec(int x, int y) { return (x -= y) < 0 ? x + mod : x; }
inline int mul(int x, int y) { return 1ll * x * y % mod; }
inline int powmod(int x, int y) {
int ret = 1 % mod;
for(; y; y >>= 1) {
if(y & 1) ret = mul(ret, x);
x = mul(x, x);
}
return ret;
}
namespace min_25 {
int Prime[NN], vp[NN], sp[NN], sp2[NN], tot, sqn;
ll n;
void seive(int n = sqn) {
rep(i,2,n) {
if(!vp[i]) {
Prime[++ tot] = i;
sp[tot] = inc(i, sp[tot - 1]);
sp2[tot] = inc(1ll * i * i % mod, sp2[tot - 1]);
}
for(int j = 1; j <= tot && 1ll * i * Prime[j] <= n; ++ j) {
vp[i * Prime[j]] = 1;
if(i % Prime[j] == 0) break;
}
}
}
ll w[NN << 1];
int idx1[NN], idx2[NN], npd;
void prework() {
seive();
for(ll i = 1; i <= n; i = n / (n / i) + 1) {
w[++ npd] = n / i;
if(n / i <= sqn) idx1[n / i] = npd;
else idx2[i] = npd;
}
}
inline int pls(ll x) { return x <= sqn ? idx1[x] : idx2[n / x]; }
int g1[NN << 1], g2[NN << 1];
void getG() {
rep(i,1,npd) {
if(w[i] == 1) g1[i] = g2[i] = 0;
else {
g1[i] = dec(mul(mul(w[i] % mod, (w[i] + 1) % mod), (mod + 1) >> 1), 1);
g2[i] = dec(mul(mul(w[i] % mod, (w[i] + 1) % mod), mul((w[i] << 1 | 1) % mod, iv6)), 1);
}
}
rep(j,1,tot) {
for(int x = 1; 1ll * Prime[j] * Prime[j] <= w[x] && x <= npd; ++ x) {
g1[x] = dec(g1[x], mul(Prime[j], dec(g1[pls(w[x] / Prime[j])], sp[j - 1])));
g2[x] = dec(g2[x], mul(1ll * Prime[j] * Prime[j] % mod, dec(g2[pls(w[x] / Prime[j])], sp2[j - 1])));
}
}
rep(x,1,npd) g1[x] = dec(g2[x], g1[x]);
}
int S(ll x, int j) {
if(Prime[j] >= x) return 0;
int ans = dec(g1[pls(x)], dec(sp2[j], sp[j]));
for(int k = j + 1; k <= tot && 1ll * Prime[k] * Prime[k] <= x; ++ k) {
ll tmp = Prime[k];
for(int e = 1; tmp <= x; ++ e, tmp *= Prime[k]) {
ans = inc(ans, mul(((tmp % mod * tmp % mod - tmp) % mod + mod) % mod, inc(e > 1, S(x / tmp, k))));
}
}
return ans;
}
int calc(ll nn) {
n = nn, sqn = sqrt(n);
prework();
getG();
return inc(S(n, 0), 1);
}
};
signed main() {
if(fopen("yl.in", "r")) {
freopen("yl.in", "r", stdin);
freopen("yl.out", "w", stdout);
}
int n;
scanf("%d", &n);
printf("%d\n", min_25::calc(n));
return 0;
}