Du teach sieve core formula
$g(1)S(n)=\sum\limits_{i=1}^n(f*g)(i)-\sum\limits_{i=2}^n g(i)S(\lfloor \frac{n}{i}\rfloor)$
$ S $ is the request and $ f $ prefix, $ g $ is a function of the structure
$ G $ $ G $ prefix needs to meet and $ f * g $ and can $ O (1) $ obtained
$ N $ is the maximum range, $ N2 $ a $ N ^ {2/3} $, $ N3 $ a $ N ^ {1/3} $.
To change the $ ll $ on $ map $ and $ sum $ when $ N $ in scope than $ int $
When multiple sets of data, only the beginning of a call init, after each set of data map not cleared
const int N2 = 5e6+10; int cnt,f[N2],p[N2],vis[N2]; map<int,int> S2; void init() { f[1] = 1; REP(i,2,N2-1) { if (!vis[i]) p[++cnt]=i,f[i] = ((ll)i*i-1)%P; for (int j=1,t;j<=cnt&&i*p[j]<N2; ++j) { vis[t=i*p[j]] = 1; if (i%p[j]==0) {f[t]=(ll)f[i]*p[j]%P*p[j]%P;break;} f[t] = (ll)f[i]*f[p[j]]%P; } } REP(i,2,N2-1) f[i] = (f[i]+f[i-1])%P; } int g(int n) {return 1;} int sum_g(int n) {return n;} int sum_fg(int n) {return (ll)n*(n+1)%P*(2*n+1)%P*inv6%P;} int sum(int n) { if (n<N2) return f[n]; if (S2.count(n)) return S2[n]; int ans = sum_fg(n), mx = sqrt(n); REP(i,2,mx) ans=(ans-(ll)g(i)*sum(n/i))%P; for (int i=mx+1,j,k=n/i; i<=n; i=j+1,--k) { j = n/k; ans = (ans-(ll)(sum_g(j)-sum_g(i-1))*sum(k))%P; } return S2[n]=ans; } void init() { f[1] = 1; REP(i,2,N2-1) { if (!vis[i]) p[++cnt]=i, f[i] = 1; for (int j=1,t;j<=cnt&&i*p[j]<N2; ++j) { vis[t=i*p[j]] = 1; if (i%p[j]==0) {f[t] = 1;break;} f[t] = (ll)f[i]*f[p[j]]%P; } } REP(i,2,N2-1) f[i] = (f[i]+f[i-1])%P; } int sum(int n) { if (n<N2) return f[n]; if (S2.count(n)) return S2[n]; int ans = sum_fg(n), mx = sqrt(n); REP(i,2,mx) ans=(ans-(ll)g(i)*sum(n/i))%P; for (int i=mx+1,j,k=n/i; i<=n; i=j+1,--k) { j = n/k; ans = (ans-(ll)(sum_g(j)-sum_g(i-1))*sum(k))%P; } if (ans<0) ans += P; return S2[n]=ans; }
Without written map, so that each set of data needed to $ v $ with a time stamp is cleared.
const int N2 = 5e6+10; const int N3 = 2510; int clk,cnt,f[N2],p[N2],vis[N2]; int S2[N3], v[N3]; void init() { f[1] = 1; REP(i,2,N2-1) { if (!vis[i]) p[++cnt]=i, f[i] = 1; for (int j=1,t;j<=cnt&&i*p[j]<N2; ++j) { vis[t=i*p[j]] = 1; if (i%p[j]==0) {f[t] = 1;break;} f[t] = (ll)f[i]*f[p[j]]%P; } } REP(i,2,N2-1) f[i] = (f[i]+f[i-1])%P; } int sum(int n) { if (n<N2) return f[n]; int x = N/n; if (v[x]==clk) return S2[x]; v[x] = clk; int &ans = S2[x] = sum_fg(n), mx = sqrt(n); REP(i,2,mx) ans=(ans-(ll)g(i)*sum(n/i))%P; for (int i=mx+1,j,k=n/i; i<=n; i=j+1,--k) { j = n/k; ans = (ans-(ll)(sum_g(j)-sum_g(i-1))*sum(k))%P; } if (ans<0) ans += P; return ans; }