P6235 [LOJ] 区间素数个数
求 : (\(n \leq 10^{11}\))
\[\sum\limits^n_{i=1} [i \in prime]
\]
根据洲阁筛的套路 :
\[\sum\limits^n_{i=n^{\frac 1 2}+1} [i \in prime]+\sum\limits^{n^{\frac 1 2}}_{i=1} [i \in prime]
\]
后面那个东西随便跑 , \(O(n^{\frac 1 2} \log n^{\frac 1 2})\)。
考虑前面那个东西 , 其实就是洲阁筛中的 \(g(n^{\frac 1 2},n)\) 吗。具体见 \(\text{Blog}\)。
阉割版洲阁筛 ? 时间复杂度 \(O(\frac{n^{\frac 3 4}}{\ln n})\) ?
超时暴毙 , \(\text{LOJ}\) 的极快评测下还是超了 \(500^+\text{ms}\) 被卡成了可怜的 \(70\text{pts}\)。 由于我非常的懒 , 所以并没有去写欧拉筛。
建议出题人在 \(10^{11}\) 的时候将时间限制调成 \(2 \text s\) 或者是直接出 \(10^{10}\)。
后来博主改了欧拉筛 , 只有 \(80\text{pts}\) , 绝望。
Const
total=1000000+10;
ready=2000000;
var
recf,incea,prime,whether:array[-1..total] of int64;
i,j,tot,sum,prepare:longint;
n,pos:int64;
function Sieve(x:longint;y:int64):int64;
begin
if x=0 then exit(y);
if y<=ready then
begin
if x>=incea[y] then exit(1);
if x>=incea[trunc(sqrt(y))] then exit(incea[y]-x+1);
end;
Sieve:=Sieve(x-1,y)-Sieve(x-1,y div prime[x]);
end;
begin
read(n); prepare:=trunc(sqrt(n));
for i:=2 to ready do for j:=2 to ready div i do whether[i*j]:=-1;
for i:=2 to ready do inc(incea[i],incea[i-1]+whether[i]+1);
for i:=2 to ready do if whether[i]<>-1 then begin inc(sum); incea[i]:=sum; prime[sum]:=i; end;
for i:=1 to sum do if prime[i]>prepare then begin pos:=i-1; break; end;
writeln(pos+Sieve(trunc(pos+1),n));
end.
完结撒花!✿✿ヽ(゚▽゚)ノ✿