[中山市选] 完全平方数

方法:欧拉筛法 莫比乌斯函数


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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值