杜教筛求助
查看原帖
杜教筛求助
759821
syzxzqy楼主2023/10/8 20:27

评测器似乎有问题,样例正确,WA了十一个点,下载了样例一,线下测试正确,IDE 也正确,不知哪里错了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int n=1.7e6;
ll i,j,t,T,x,prime[n],cur,mu[n],sum_mu[n];
bool vis[n];
map<ll,ll> mp_mu;
ll smu(ll x){//求mu的前缀和
	if(x<=n) return sum_mu[x];
	if(mp_mu[x]) return mp_mu[x];
	ll ret=1ll;
	for(ll l=2,r;l<=x;l=r+1)
		r=x/(x/l),ret-=smu(x/l)*(r-l+1);
	return mp_mu[x]=ret;
}
ll sphi(ll x){//求phi的前缀和
	ll ret=0;
	for(ll l=1,r;l<=x;l=r+1)
		r=x/(x/l),ret+=(smu(r)-smu(l-1))*(x/l)*(x/l);
	return (ret-1)/2+1;
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	mu[1]=1;
	for(i=2;i<=n;++i){
		if(!vis[i]) prime[++t]=i,mu[i]=-1;
		for(j=1;j<=t&&i*prime[j]<=n;++j){
			vis[i*prime[j]]=1;
			if(i%prime[j]!=0) mu[i*prime[j]]=-mu[i];
			else{mu[i*prime[j]]=0;break;}
		}
	}
	for(i=1;i<=n;++i)
		sum_mu[i]=sum_mu[i-1]+mu[i];
	cin>>T;
	while(T--)
		cin>>x,cout<<sphi(x)<<" "<<smu(x)<<"\n";
}
2023/10/8 20:27
加载中...