评测器似乎有问题,样例正确,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";
}