求调
查看原帖
求调
553501
可爱的小棉羊楼主2024/2/23 15:22

合理怀疑是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;
}
2024/2/23 15:22
加载中...