此代码开O2会WA
在DEV下开O2编译会弹出警告:
24 11 C:\Users\测试用户\Desktop\未命名1.cpp [Warning] iteration 9999998u invokes undefined behavior [-Waggressive-loop-optimizations]
但我不知道为什么
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
const int mod=1e9+7,N=1e7,ny2=5e8+4,ny3=333333336;
cc_hash_table<int,int>NOI;
int n,zs[1000005],dx,f[N+5];
bool vis[N];
int NTT(int n){
if(n<=N)return f[n];
if(NOI[n])return NOI[n];
long long ans=(1ll*n*(n+1)/2)%mod,p=2,ls;
while(p<=n){
ls=n/(n/p);
ans=(ans-1ll*(ls-p+1)*NTT(n/p)%mod+mod)%mod;
p=ls+1;
}
return NOI[n]=ans%mod;
}
signed main(){
cin>>n;
f[1]=1;
for(int i=2;i<=N;i++){
if(vis[i]==0)zs[++dx]=i,f[i]=i-1;
for(int j=1;j<=dx;j++){
if(1ll*i*zs[j]>N)break;
vis[i*zs[j]]=1;
if(i%zs[j]==0){
f[i*zs[j]]=f[i]*zs[j];
break;
}else f[i*zs[j]]=f[i]*(zs[j]-1);
}
}
for(int i=1;i<=N;i++)f[i]=(f[i-1]+f[i])%mod;
long long ans=0,FFT,p=2,ls;
while(p<=n){
ls=n/(n/p),FFT=(1ll*NTT(ls)-NTT(p-1)+mod)%mod;
ans=(ans+FFT*2*(n/p)%mod*(n/p))%mod;
p=ls+1;
}
ans=(ans+1ll*n*n)%mod;
cout<<ans;
return 0;
}