找了个对的对拍发现4e9的样例就不对了。 找了很久没找到漏取模的地方,是哪里漏了吗? 还是写错了qaq
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
inline bool isprime(ll num)
{if(num==2||num==3)return true;
if(num%6!=1&&num%6!=5)return false;
for(int i=5;1ll*i*i<=num;i+=6){if(num%i==0||num%(i+2)==0)return false;}
return true;}
const int mod = 1e9+7;
inline ll mul(ll a,ll b,ll c){return (a*b-(ll)((ld)a*b/c)*c+c)%c;}
inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll g = exgcd(b,a%b,y,x);y-=a/b*x;return g;}
inline ll quick_pow(ll a,ll b,ll mod){ll res=1;while(b){if(b&1)res=mul(res,a,mod);a=mul(a,a,mod);b>>=1;}return res;}
inline ll quick_pow(ll a,ll b){ll res=1;while(b){if(b&1)res=mul(res,a,mod);a=mul(a,a,mod);b>>=1;}return res;}
inline ll inv(ll x){return quick_pow(x,mod-2);}
inline ll inv(ll x,ll mod){return quick_pow(x,mod-2,mod);}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
const int N = 1e6+10;
ll n,g[N],h[N],w[N],sn,id,inv6,inv2;
ll ppre1[N],ppre2[N];
ll prime[N],cnt,id1[N],id2[N];
bool vis[N];
ll Id(ll x){
return x<=sn?id1[x]:id2[n/x];
}
void init(){
for(int i=2;i<N;i++){
if(!vis[i]){
prime[++cnt]=i;
ppre1[cnt]=(ppre1[cnt-1]+i)%mod;
ppre2[cnt]=(ppre2[cnt-1]+1ll*i*i%mod)%mod;
}
for(int j=1;j<=cnt&&1ll*i*prime[j]<N;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
break;
}
}
}
}
ll sum3(ll x){
return x*(x+1)%mod*((2*x+1)%mod)%mod*inv6%mod;
}
ll sum2(ll x){
return x*(x+1)%mod*inv2%mod;
}
ll f(ll x){
if(x==1)return 0;
x%=mod;
return x*(x-1)%mod;
}
ll S(ll x,int y){
if(x<=1 || prime[y]>x)return 0;
ll k = Id(x);
ll res = ( ((g[k] - ppre2[y-1]+mod)%mod) - ((h[k] - ppre1[y-1]+mod)%mod) + mod)%mod;
for(int i=y;i<=cnt&&1ll*prime[i]*prime[i]<=x;i++){
ll t1 = prime[i], t2 = 1ll*prime[i]*prime[i];
for(;t2<=x;t1=t2,t2*=prime[i]){
res += ((S(x/t1,i+1) * f(t1))%mod + f(t2)%mod)%mod;
res%=mod;
}
}
return res%mod;
}
int main(){
inv6 = inv(6);
inv2 = inv(2);
init();
scanf("%lld",&n);
sn = sqrt(n);
for(ll l=1,r;l<=n;l=r+1){
r = n/(n/l);w[++id]=n/l;
g[id] = sum3(w[id]);
g[id] = (g[id] - 1 + mod )%mod;
h[id] = sum2(w[id]);
h[id] = (h[id] - 1 + mod)%mod;
if(w[id]<=sn)id1[w[id]] = id;
else id2[r] = id;
}
ll pre1 = 0, pre2 = 0;
for(int j=1;j<=cnt;j++){
ll t2 = prime[j]*prime[j]%mod;
ll t1 = prime[j];
for(int i=1;i<=id&&1ll*prime[j]*prime[j]<=w[i];i++){
ll k = Id(w[i]/prime[j]);
(g[i]-= t2*(g[k] - pre2)%mod)%=mod;
g[i]=(g[i]+mod)%mod;
(h[i]-= t1*(h[k] - pre1)%mod)%=mod;
h[i]=(h[i]+mod)%mod;
}
(pre2+=t2)%=mod;
(pre1+=t1)%=mod;
}
ll ans = S(n,1) + 1;
printf("%lld\n",(ans+mod)%mod);
}