为什么这份代码会RE
查看原帖
为什么这份代码会RE
310801
Spouter_27楼主2022/8/15 22:30

当n=2147483647时会RE。不知道问题出在哪里。

//Code By Spouter_27
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=5e6,Inf=1e18;
ll t,n,mil[N+10],phi[N+10]; 
ll prim[N+10],cnt;
bool vis[N+10];
unordered_map<ll,ll> ans_mil,ans_phi;
void init(){
	mil[1]=phi[1]=1;
	for(int i=2;i<=N;i++){
		if(!vis[i]){
			prim[++cnt]=i;mil[i]=-1,phi[i]=i-1;
		}
		for(int j=1;j<=cnt&&prim[j]*i<=N;j++){
			vis[prim[j]*i]=1;
			if(i%prim[j]==0){
				phi[prim[j]*i]=phi[i]*prim[j];
				break;
			}
			phi[prim[j]*i]=phi[i]*phi[prim[j]];
			mil[prim[j]*i]=-mil[i];
		} 
	}
	for(int i=2;i<=N;i++){
		mil[i]+=mil[i-1];phi[i]+=phi[i-1];
	}
}
ll summil(ll n){
	if(n<=N)	return mil[n]; 
	if(ans_mil[n])	return ans_mil[n];
	ll ans=1;
	for(int l=2,r;l<=n;l=r+1){
		r=min(n/(n/l),n);
		ans-=(r-l+1)*summil(n/l);
	}
	ans_mil[n]=ans;
	return ans;
}
ll sumphi(ll n){
	if(n<=N)	return phi[n];
	if(ans_phi[n])	return ans_phi[n];
	ll ans=n*(n+1)/2;
	for(int l=2,r;l<=n;l=r+1){
		r=min(n/(n/l),n);
		ans-=(r-l+1)*sumphi(n/l);
	}
	ans_phi[n]=ans;
	return ans;
}
signed main(){
	scanf("%lld",&t);
	init();
	while(t--){
		scanf("%lld",&n);
		printf("%lld %lld\n",sumphi(n),summil(n));
	}
	return 0;
}
2022/8/15 22:30
加载中...