方法:欧拉筛法 莫比乌斯函数
program number;
const
maxt=50000;
var
isprime:array[1..maxt]of boolean;
prime:array[1..maxt]of longint;
minu:array[1..maxt]of shortint;
total,test,n:longint;
ll,rr,mid:int64;
procedure primemake;
var
i,j:longint;
begin
fillchar(isprime,sizeof(isprime),true);
for i:=2 to maxt do begin
if isprime[i] then begin
inc(total);
prime[total]:=i;
minu[i]:=-1;
end;
for j:=1 to total do begin
if prime[j]*i>maxt then break;
isprime[prime[j]*i]:=false;
minu[prime[j]*i]:=-minu[i];
if i mod prime[j]=0 then begin
minu[prime[j]*i]:=0;
break;
end;
end;
end;
end;
function get(const n:longint):int64;var i:longint;
begin
get:=n;
for i:=1 to trunc(sqrt(n)) do get:=get+minu[i]*(n div sqr(i));
end;
begin
readln(test); primemake;
for test:=1 to test do begin
readln(n);
if n=1 then begin writeln(1); continue; end;
ll:=1;rr:=n<<1+1;
while ll+1<rr do begin
mid:=(ll+rr)>>1;
if get(mid)<n then ll:=mid else rr:=mid;
end;
writeln(rr);
end;
end.