萌新求助,本地 1e12 跑 12.5s,交上去就 TLE
查看原帖
萌新求助,本地 1e12 跑 12.5s,交上去就 TLE
98618
Provicy楼主2021/5/7 13:37

RT

#include <bits/stdc++.h>
#pragma GCC optimize(3)
#define int long long
#define ll unsigned long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
#define vi vector<int>
#define vpi vector<pair<int,int>>
using namespace std; const int N=30000010;
inline int read()
{
	int s=0, w=1; ri char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
	return s*w;
}
int pri[N/10],cnt,mu[N],d[N],e[N];
bool book[N];
inline void Init()
{
	mu[1]=d[1]=1;
	for(ri int i=2;i<N;i++)
	{
		if(!book[i]) pri[++cnt]=i, mu[i]=-1, e[i]=1, d[i]=2;
		for(ri int j=1;j<=cnt&&i*pri[j]<N;j++)
		{
			book[i*pri[j]]=1;
			if(i%pri[j]==0)
			{
				e[i*pri[j]]=e[i]+1;
				d[i*pri[j]]=d[i]/e[i*pri[j]]*(e[i*pri[j]]+1);
				break;
			}
			else mu[i*pri[j]]=-mu[i], e[i*pri[j]]=1, d[i*pri[j]]=d[i]*2;
		}
	}
	for(ri int i=1;i<N;i++) d[i]+=d[i-1];
}
map<ll,ll> Q;
inline ll Sig(int x)
{
	if(x<N) return d[x];
	if(Q[x]) return Q[x];
	ll res=0;
	for(ri int l=1,r;l<=x;l=r+1)
	{
		r=x/(x/l);
		res+=(x/l)*(r-l+1);
	}
	return Q[x]=res;
}
signed main()
{
	Init();
	int T;
	for(scanf("%lld",&T);T;T--)
	{
		int n;
		scanf("%lld",&n);
		ll ans=0;
		for(ri int j=1;j*j<=n;j++)
		{
			if(!mu[j]) continue;
			ll res=0;
			int m=n/(j*j);
			for(ri int l=1,r;l<=m;l=r+1)
			{
				r=m/(m/l);
				res+=(m/l)*(Sig(r)-Sig(l-1));
			}
			ans+=res*mu[j];
		}
		printf("%llu\n",ans);
	}
	return 0;
}
2021/5/7 13:37
加载中...