我蒟蒻讲不清 = =
#include "stdio.h"
#include "algorithm"
#include "iostream"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "vector"
#include "map"
#include "set"
using namespace std;
typedef long long ll;
const int N = 0x7fffffff, M = 5000000;
const int PRIMENUM = 1000000, S = M + 5;
bool flag[S];int pri[PRIMENUM],num;
ll seu[S],n,smu[S];
void build(){
flag[1]=smu[1]=seu[1]=1;
for(int i=2;i<=M;i++){
if(flag[i]^1){
pri[++num]=i;
smu[i]=-1;seu[i]=i-1;
}
for(int j=1;pri[j]*i<M;j++){
int k=i*pri[j];flag[k]=true;
if(i%pri[j]==0){seu[k]=seu[i]*pri[j],smu[k]=0;break;}
else seu[k]=seu[i]*(pri[j]-1),smu[k]=-smu[i];
}
}
for(int i=1;i<=M;i++)smu[i]+=smu[i-1],seu[i]+=seu[i-1];
}
ll deu[1500],dmu[1500];
bool veu[1500],vmu[1500];
__attribute__((optimize("-O3")))
ll ans1(ll x){
if(x<=M)return seu[x];int t=n/x;
if(veu[t])return deu[t];veu[t]=true;
int i,last;ll ans=x*(ll)(x+1)/2;
for(i=2;i-1<=x-1;i=last+1){
last=x/(x/i);
ans-=(last-i+1)*ans1(x/i);
}
return deu[t]=ans;
}
__attribute__((optimize("-O3")))
ll ans2(ll x){
if(x<=M)return smu[x];int t=n/x;
if(vmu[t])return dmu[t];
vmu[t]=true;int i,last;ll ans=1;
for(i=2;i-1<=x-1;i=last+1){
last=x/(x/i);
ans-=(last-i+1)*ans2(x/i);
}
return dmu[t]=ans;
}
int main(){
build();int T;scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(deu,0,sizeof(deu));
memset(dmu,0,sizeof(dmu));
memset(veu,false,sizeof(veu));
memset(vmu,false,sizeof(vmu));
printf("%lld %lld\n",ans1(n),ans2(n));
}
return 0;
}