嗯在刚刚(没错就是在几分钟之前!)我学会了线性筛法
实在是一个很好的筛法
正常的筛法,都会对一个数筛多次
但是欧拉筛法不会
欧拉筛法是用它的最大因数去筛 别跟我说最小质因数,那个很难让人理解 虽然最小质因数和最大因数是一样的
我们假设一个数k,它是t的最大因数
容易知道t是不唯一的
那我们要乘以一个质数得到k
那这个质数应该是什么呢?
如果我们傻傻地把k和所有质数乘一起,那就会不符合“k是最大因数了“对吧
那我们应该怎么搞呢?
我们把质因数从小到大枚举过去,如果一旦遇到一个k mod it =0的,就break
为什么呢?
假设一个质数y
k*y把它因式分解后,最小质因数是k的最小质因数和y之间的较小值
那么最大因数就是这个数除以最小质因数么。。
如果y<=[k 的 最小质因数],那么k*y的最小质因数就是y,最大因数就是k,是满足条件的
反之则不满足条件
而it正是k的最小质因数,所以在it之前的都可以筛,但是it之后的就不符合了
Code:
for i:=2 to n do
begin
if not(prime[i]) then begin inc(tot); ant[tot]:=i; end;
for j:=1 to tot do
begin
if ant[j]*i>n then break;
prime[ant[j]*i]:=true;
if (i mod ant[j]=0) then break;
end;
end;