确定素数。
从每个素数出发,将其倍数都筛掉。
每一个合数会被访问多次;复杂度$O(nloglogn)$。
for(int i=2;i<=maxn;i++) { if(!vist[i]) for(int j=i*i;j<=maxn;j+=i) vist[j]=1; }
对于每一个i,寻找素数使得与i的乘积中该素数为最小因子。由于每一个数的最小因子一定,该数就被唯一地访问。
避免了重复访问;复杂度$O(n)$(?)。
for(int i=2;i<=maxn;i++) { if(!vist[i]) prime[++t]=i; for(int j=1;j<=t&&i*prime[j]<=maxn;j++) { vist[i*prime[j]]=1; if(!(i%prime[j])) break; } }
杜教筛、min_25筛、洲阁筛学到积性函数再补。