遇到厌氧问题(50pts),求助
查看原帖
遇到厌氧问题(50pts),求助
329682
suibian1234楼主2025/2/2 11:12

此代码开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;
}
2025/2/2 11:12
加载中...