TLE80分求助
查看原帖
TLE80分求助
752953
sLMxf楼主2024/9/29 21:58

rt,T#9,#10.

#include<bits/stdc++.h>
#define int long long
using namespace std;
int mb[500005],phi[500005];
int prime[500005],p[500005],tot;
unordered_map<int,int>summb,sumphi,Bool;
void shai(int n=500000)
{
	mb[1]=1,phi[1]=1,p[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!p[i]) prime[++tot]=i,mb[i]=-1,phi[i]=i-1;
		for(int j=1;j<=tot&&i*prime[j]<=n;j++)
		{
			p[i*prime[j]]=1;
			if(i%prime[j]==0)
			{
				mb[i*prime[j]]=0;
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			mb[i*prime[j]]=-mb[i];
			phi[i*prime[j]]=phi[i]*phi[prime[j]];
		}
	}
	for(int i=1;i<=n;i++) summb[i]=summb[i-1]+mb[i],sumphi[i]=sumphi[i-1]+phi[i],Bool[i]=1;
}
void search(int n)
{
	if(Bool[n]) return;
	Bool[n]=1;
	int ans1=1,L=2,R,ans2=(n+1)*n/2;
	for(;L<=n;L=R+1)
	{
        int x=n/L;
		R=n/x;
		search(x);
		ans1-=(R-L+1)*summb[x];
		ans2-=(R-L+1)*sumphi[x];
	}
	summb[n]=ans1;sumphi[n]=ans2;
}
int n;
void solve()
{
	cin>>n;
	search(n);
	cout<<sumphi[n]<<' '<<summb[n]<<'\n';
}
signed main()
{
	shai();
	int T;
	for(cin>>T;T--;solve());
	return 0;
}
2024/9/29 21:58
加载中...