//——整理《洛谷tg》

质数与合数
质数,也称素数或不可约数
即除1和它本身以外没有其它正因数的数
 
合数,好像没听说过其他名字
即除1和质数以外的正整数

合数a一定存在一个不超过根号下a的质因子
上面这条性质可以帮助我们在O(n)的时间复杂度内检验质数

相信大家都听说过O(nlnnlnn)的Eratosthenes筛法
反正它似乎跑的不慢,



#include<bits/stdc++.h>
  for (int i=1;i<maxn;i++)
     for (int j=i<<1;j<maxn;j+=i)
       a[j]=0;


 线性筛
 这里介绍了下线性筛
 
 线性筛及其复杂度的证明
   for (int i=2;i*i<=maxn;i++)
     if (a[i]==0)
	   for (int j=i<<1;j<=maxn;j+=i)
	     a[j]=1;

线性筛中,每个数只会被它最小的质因子筛去

void Euler_Sieve(){
	for (int i=2;i<maxn;i++)
	{
	
	  if (!vis[i]){
	  	pri[tot++]=i;
	  }
	 for(int j=0;j<tot&&pri[j]*i<maxn;j++)
	   {
	   	vis[pri[j]*i]=1;
	   	if (i%pri[j]==0)
		     break; 
		} 
	} 
}

线性筛中,每个数只会被它最小的质因子筛去
比如,设i=35=5*7
则通过i筛去的数是2*i,3*i和5*i,即
 2*5*7=70
 3*5*7=105
 5*5*7-175
 
可以看成往原数中添加不超过i的最小质因子的质数
每个数只被筛了一次,所以保证线性
显然每个被筛去的数都只会被其最小的质因子pri[j]筛去一次。
所以这个算法复杂度是线性的。