合理怀疑是int爆了。
但我不知道咋改,第一组数据通过
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,inv2=500000004,inv3=333333336;
int n,sqn,cnt,prime[50005];
long long g2[200005],tot,g1[200005];
long long sp1[100005],sp2[100005];
int ind1[100005],ind2[100005];
long long w[200006];
bool vis[100005];
void init(){
vis[1]=1;
for(int i=2;i<=sqn;i++){
if(!vis[i]){
prime[++cnt]=i;
sp1[cnt]=(sp1[cnt-1]+i)%mod;
sp2[cnt]=(sp2[cnt-1]+1ll*i*i)%mod;
}
for(int j=1;j<=cnt&&prime[j]*i<=sqn;j++){
vis[i*prime[j]]=0;
if(i%prime[j]==0)break;
}
}
long long l=1;
while(l<=n){
long long r=n/(n/l);
tot++;
w[tot]=n/l;
g1[tot]=((w[tot]%mod)*1ll*(w[tot]%mod+1)%mod*inv2%mod)%mod;
//cout<<n/l<<" "<<n/l+1<<" "<<inv2<<" "<<g1[tot]<<" "<<tot<<endl;
g2[tot]=(g1[tot]*1ll*inv3%mod*(w[tot]*2+1)%mod+mod)%mod;
g2[tot]--;
g2[tot]%=mod;
g1[tot]=(g1[tot]+mod-1)%mod;
if(n/l>=sqn)ind2[n/(n/l)]=tot;
else ind1[n/l]=tot;
l=r+1;
//cout<<n/l<<" "<<n/l+1<<" "<<inv2<<" "<<g1[tot]<<" "<<tot<<endl;
}
// for(int i=1;i<=n;i++)cout<<g2[i]<<endl;
// for(int i=1;i<=tot;i++){
// int k=w[i]>=sqn? ind2[n/w[i]]:ind1[w[i]];
// cout<<w[i]<<" "<<g1[k]<<" "<<g2[k]<<endl;
// }
for(int i=1;i<=cnt;i++){
for(int j=1;j<=tot&&1ll*prime[i]*prime[i]<=w[j];j++){
int k=(w[j]/prime[i])>=sqn? ind2[n/(w[j]/prime[i])]:ind1[w[j]/prime[i]];
g1[j]=(g1[j]%mod-prime[i]*1ll*(g1[k]-sp1[i-1])%mod+mod)%mod;
g2[j]=(g2[j]%mod-prime[i]*1ll%mod*prime[i]*1ll%mod*(g2[k]-sp2[i-1])%mod+mod)%mod;
}
}
// for(int i=1;i<=tot;i++){
// int k=w[i]>=sqn? ind2[n/w[i]]:ind1[w[i]];
// cout<<w[i]<<" "<<g1[k]<<" "<<g2[k]<<endl;
// }
}
int S(long long x,int y){
if(prime[y]>=x)return 0;
long long ans,k=x>=sqn? ind2[n/x]:ind1[x];
ans=(1ll*(g2[k]-g1[k])%mod-(sp2[y]-sp1[y])%mod+mod)%mod;
ans=(ans%mod+mod)%mod;
for(int i=y+1;i<=cnt&&1ll*prime[i]*prime[i]<=x;i++){
long long pe=prime[i];
for(int e=1;pe<=x;e++,pe*=prime[i]){
long long tmp=pe%mod;
ans=(ans+1ll*tmp*(tmp-1)%mod*(S(x/pe,i)%mod+(e!=1))%mod)%mod;
ans=(ans+mod)%mod;
}
}
return ans%mod;
}
int main(){
cin>>n;
sqn=sqrt(n);
init();
cout<<(S(n,0)+1)%mod<<endl;
}