//O(nlognlogn)
bool f[N];
void isprime()
{
memset(f,false,sizeof(f));
f[1]=f[0]=true;
for (int i=2;i<N;i++)
{
if (f[i]==false)
for (int j=i*i;j<N;j=j+i)
f[j]=true;
}
}
//速度大约是埃氏筛的3~4倍,在数据量小的时候甚至慢些(用到了mod运算)
//O(n)欧拉线性筛
int flag[N],primes[N];
int totPrimes;
void euler_sieve(int n)
{
totPrimes = 0;
memset(flag, 0, sizeof(flag));
for (int i = 2; i <= n; i++) {
if (!flag[i])
primes[totPrimes++] = i;
for (int j = 0; i * primes[j] <= n; j++) {
flag[i*primes[j]] = true;
//当i能整除prime[j],那么i*prime[j+1]这个合数肯定被prime[j]乘以某个数筛掉。
if (i % primes[j] == 0)
break;
}
}
}