#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;
}
每个合数只被他最小的素因子筛掉一遍,看不懂。