zoukankan      html  css  js  c++  java
  • 【BZOJ2440】完全平方数(莫比乌斯函数,容斥原理)

    题意:求第k个无平方因子数

    k<=10^9

    思路:

    感觉这东西和欧拉筛差不多……活到老学到老,退役前学点知识也是好的

    为什么二分答案的上界是2*n?连LYY都证不出来

    话说约大爷一年之前就已经AC此题……%%%

     1 const max=50000;
     2 var mu,flag,prime:array[1..max]of int64;
     3     cas,v,i,m,j,n:longint;
     4     ans,l,r,mid,last,tmp:int64;
     5 
     6 function clac(n:int64):int64;
     7 var i:longint;
     8 begin
     9  clac:=0;
    10  for i:=1 to trunc(sqrt(n)) do clac:=clac+mu[i]*n div (i*i);
    11 end;
    12 
    13 begin
    14  assign(input,'bzoj2440.in'); reset(input);
    15  assign(output,'bzoj2440.out'); rewrite(output);
    16  readln(cas);
    17  mu[1]:=1;
    18  for i:=2 to max do
    19  begin
    20   if flag[i]=0 then
    21   begin
    22    inc(m); prime[m]:=i;
    23    mu[i]:=-1;
    24   end;
    25   j:=1;
    26   while prime[j]*i<=max do
    27   begin
    28    flag[prime[j]*i]:=1;
    29    if i mod prime[j]=0 then
    30    begin
    31     mu[prime[j]*i]:=0;
    32     break;
    33    end;
    34    mu[prime[j]*i]:=-mu[i];
    35    inc(j);
    36   end;
    37  end;
    38  for v:=1 to cas do
    39  begin
    40   readln(n);
    41   l:=1; r:=2*n; last:=1;
    42   while l<=r do
    43   begin
    44    mid:=(l+r)>>1;
    45    tmp:=clac(mid);
    46    if tmp=n then begin last:=mid; r:=mid-1; end
    47     else if tmp<n then l:=mid+1
    48      else r:=mid-1;
    49   end;
    50   writeln(last);
    51  end;
    52  close(input);
    53  close(output);
    54 end.
  • 相关阅读:
    由u盘安装Ubuntu引出的事件
    初试Ubuntu
    从error 中学习
    快手一面:牛客:字符串左移
    快手一面:Leetcode:最小栈
    十三、线程池
    十二、windows临界区、其他各种mutex互斥量
    十一、std::async深入
    LeetCode(703):找出数据流中的第K大元素
    LeetCode(1003):检查替换后的字符串
  • 原文地址:https://www.cnblogs.com/myx12345/p/6656433.html
Copyright © 2011-2022 走看看