爲什麽這個是錯的
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Mod=1e9+7,Maxn=3e6+7,inv2=500000004,inv3=333333336;
ll n,sq,cnt;
ll g1[Maxn],g2[Maxn],id[Maxn],S;
ll pos1[Maxn],pos2[Maxn],sp[Maxn],g[Maxn];
ll sg1[Maxn],sg2[Maxn];
inline ll up(ll x){
return (x%Mod+Mod)%Mod;
}
ll p[Maxn],tot;
bitset<Maxn>isp;
inline void init(ll N){
isp[0]=isp[1]=1;
for(ll i=2;i<=N;i++){
if(!isp[i]){
p[++tot]=i;
if(tot>1) sg1[tot]=(sg1[tot-1]+i)%Mod,sg2[tot]=(sg2[tot-1]+1ll*i*i%Mod)%Mod;
else sg1[tot]=i,sg2[tot]=i*i%Mod;
}
for(ll j=1;j<=tot;j++){
const ll t=i*p[j];if(t>N) break;
isp[t]=1;if(!(i%p[j])) break;
}
}
}
inline ll Get(ll x){
if(x<=sq) return pos1[x];
return pos2[n/x];
}
ll G(ll x,ll y){
if(p[y]>x) return 0;
ll ret=up((g2[Get(x)]-g1[Get(x)])-(sg2[y]-sg1[y]));
for(ll i=y+1;i<=tot&&1ll*p[i]*p[i]<=x;i++){
for(ll c=1,j=p[i];j<=x;c++,j*=p[i]){
ll res=j%Mod*up(j-1)%Mod;
ret=up(ret+res*G(x/j,i)%Mod+(c>1)*res%Mod);
}
}
return ret;
}
int main(){
scanf("%lld",&n);
sq=sqrt(n);
init(sq);
cnt=sq+n/sq-1;
for(ll i=1;i<=cnt;i++) {
id[i]=i<=sq?n/i:id[i-1]-1,g1[i]=id[i]%Mod,
g2[i]=up(g1[i]*(g1[i]+1)%Mod*inv2%Mod*(2*g1[i]+1)%Mod*inv3%Mod-1),g1[i]=up(g1[i]*(g1[i]+1)%Mod*inv2%Mod-1);
if(id[i]<=sq) pos1[id[i]]=i;
else pos2[n/id[i]]=i;
}
for(ll j=1;j<=tot;j++)
for(ll i=1;i<=cnt&&id[i]>=1ll*p[j]*p[j];i++)
g1[i]=up(g1[i]-1ll*p[j]*up(g1[Get(id[i]/p[j])]-sg1[j-1])%Mod),
g2[i]=up(g2[i]-1ll*p[j]*p[j]%Mod*up(g2[Get(id[i]/p[j])]-sg2[j-1])%Mod);
printf("%lld",up(G(n,0)+1));
return 0;
}
/*
633333336
*/
將記錄位置的 pos1,pos2 改成 unordered_map 就對了