WA 30 求助
查看原帖
WA 30 求助
556362
Unnamed114514楼主2022/8/25 00:04
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e7;
unordered_map<int,int> smu,sphi;
bool flg[maxn+5];
int phi[maxn+5],mu[maxn+5],r,n,p[maxn+5],cnt,T;
inline void Prime(int n){
	flg[0]=flg[1]=1;
	phi[1]=mu[1]=1;
	for(int i=2;i<=n;++i){
		if(!flg[i]){
			p[++cnt]=i;
			phi[i]=i-1;
			mu[i]=-1;
		}
		for(int j=1;j<=cnt&&p[j]<=n/i;++j){
			flg[i*p[j]]=1;
			if(i%p[j]==0){
				phi[p[j]*i]=phi[i]*p[j];
				break;
			}
			phi[i*p[j]]=phi[i]*phi[p[j]];
			mu[i*p[j]]=-mu[i];
		}
	}
	for(int i=1;i<=n;++i){
		phi[i]+=phi[i-1];
		mu[i]+=mu[i-1];
	}
}
int Smu(int n){
	if(n<=maxn)
		return mu[n];
	if(smu[n])
		return smu[n];
	int res=1;
	for(int l=2;l<=n;l=r+1){
		r=n/(n/l);
		res-=(r-l+1)*Smu(n/l);
	}
	return smu[n]=res;
}
int Sphi(int n){
	if(n<=maxn)
		return phi[n];
	if(sphi[n])
		return sphi[n];
	int res=n*(n+1)/2;
	for(int l=2;l<=n;l=r+1){
		r=n/(n/l);
		res-=(r-l+1)*Sphi(n/l);
	}
	return sphi[n]=res;
}
signed main(){
	Prime(maxn);
	scanf("%lld",&T);
	while(T--){
		scanf("%lld",&n);
		printf("%lld %lld\n",Sphi(n),Smu(n));
	}
	return 0;
}
2022/8/25 00:04
加载中...