求调,60pts,后面的点全T了
查看原帖
求调,60pts,后面的点全T了
1313003
hwc2011楼主2025/7/31 11:00
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2000001; 
int t,n,phi[N],mu[N],flg[N];
vector<int>p;
map<int,int>Phi,Mu;
int getp(int x){
	if(x<N) return phi[x];
	if(Phi[x]) return Phi[x];
	int res=(1+x)*x/2;
	for(int l=2,r;l<=x;l=r+1){
		r=n/(n/l); 
		res-=(r-l+1)*getp(x/l);
	}
	return Phi[x]=res;
} 
int getm(int x){
	if(x<N) return mu[x];
	if(Mu[x]) return Mu[x];
	int res=1;
	for(int l=2,r;l<=x;l=r+1){
		r=n/(n/l); 
		res-=(r-l+1)*getm(x/l);
	}
	return Mu[x]=res;
} 
void solve(){
	cin>>n;
	cout<<getp(n)<<' '<<getm(n)<<'\n';
}
void init(){
	mu[1]=phi[1]=1;
	for(int i=2;i<N;i++){
		if(!flg[i]){
			p.push_back(i);
			phi[i]=i-1;
			mu[i]=-1;
		}
		for(int j:p){
			if(i*j>=N) break;
			flg[i*j]=1;
			if(i%j==0){
				phi[i*j]=phi[i]*j;
				mu[i*j]=0;
				break;
			}
			phi[i*j]=phi[i]*(j-1);
			mu[i*j]=-mu[i];
		}
		phi[i]+=phi[i-1];
		mu[i]+=mu[i-1];
	}
}
signed main(){
	init();
	cin>>t;
	while(t--) solve();
}
2025/7/31 11:00
加载中...