求助TLE
查看原帖
求助TLE
276621
wangzikang楼主2023/5/2 09:28
#include<bits/stdc++.h>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define int long long
using namespace std;
int id_S(int x){return x*(x+1)/2;}
//id*mu=phi
//I*phi=id

const int N=2e6+1;
cc_hash_table <int,int>Phi,Mu,P,M;
int cnt;
int phi(int x){
	if(P[x]||x<=N)return Phi[x];
	int p=id_S(x);
	for(int l=2,r;l<=x;++l){
		r=x/(x/l);
		p-=phi(x/l)*(r-l+1);
		l=r;
	}
	return P[x]=1,Phi[x]=p;
}
int mu(int x){
	if(M[x]||x<=N)return Mu[x];
	int p=1;
	for(int l=2,r;l<=x;++l){
		r=x/(x/l);
		p-=mu(x/l)*(r-l+1);
		l=r;
	}
	return M[x]=1,Mu[x]=p;
}
int p[N+1],isp[N+1];
void Eshishai(int n){
	Mu[1]=Phi[1]=1;
	for(int i=2;i<=n;++i){
		if(!isp[i]){
			Phi[i]=i-1,Mu[i]=-1;
			p[++cnt]=i;
		}
		for(int J=1;J<=cnt;++J){
			int x=p[J],j=x*i;
			if(j>n)break;
			isp[j]=1;
			if(i%x==0){
				Phi[j]=x*Phi[i];
				//Mu[j]=-Mu[i];
				break;
			}
			Mu[j]=Mu[x]*Mu[i];
			Phi[j]=Phi[x]*Phi[i];
		}
	}
}
signed main(){
	Eshishai(N);
	for(int i=1;i<=N;++i){
		Phi[i]+=Phi[i-1];
		Mu[i]+=Mu[i-1];
	}
	int t=1;cin>>t;
	while(t--){
		int x=1e9;
		cin>>x;
		cout<<phi(x)<<' ';
		cout<<mu(x)<<'\n';
	}
	return 0;
}

这份代码T了两个点,但我不知道为什么,执行次数CNT没有任何问题,求大佬帮助

2023/5/2 09:28
加载中...