数论.素数筛

 

#define maxn 1000000
bool isPrime[maxn+1];/* isPrime[i]true表示i为素数*/
void eratos(int n){
	int i,j;
	isPrime[0] = isPrime[1] = false;
	for(i = 2;i <= n; ++i) 
		isPrime[i] = true;	
	for(i = 2;i * i <= n; ++i) 
		if(isPrime[i]){	
				for(j = i * i;j <= n;j += i) 
					isPrime[j] = false;
			}
}

 可能会想到的定义,但其实根本没用上

若n是一个合数,则至少有一个素因子。其中最小的素因子一定不大于根号n;所以2到根号n中有n的约数,n为合数。反之,素数。

{
    int n,i,j,count=0;
    a[1]=0;
    for(i=2;i

这个是数论的筛数题,不能i*i,课程中补充了筛选最小素因子,两个数组,【j】==j变为i,依次除找最小

ll getPrime(ll n,bool vis[],ll prime[]){
    ll tot=0;
    for(ll i=1;i<=n;i++)vis[i]=0;
    for(ll i=2;i<=n;i++){
        if(!vis[i])prime[tot++]=i;
        for(ll j=0;jn)break;
            vis[prime[j]*i]=1;
            if(i%prime[j]==0)break;
        }
    }
    return tot;
}

每个合数只被他最小的素因子筛掉一遍,看不懂。

你可能感兴趣的:(数论)