学习欧拉函数首先要理解线性筛。普通的筛法就不记录了。
bool number[maxn+5];
void isprime()
{
int prime[maxn+5];
int i,j,c=0;
memset(number,true,sizeof(number));
for(i=2;i<=maxn;i++)
{
if(number[i])
prime[c++]=i;
for(j=0;j<c&&prime[j]*i<=maxn;j++)
{
number[prime[j]*i]=false;
if(i%prime[j]==0) //保证每个合数只会被它的最小质因数筛去,因此每个数只会被标记一次
break;
}
}
}
这个是我不想重写了,直接粘了一下。
记录一下我的理解:刚开始初始化假设都是素数,然后把找到的素数的倍数(i倍)都标记为不是素数。
至于为什么会有i%prime[j]==0 break;
如果i是素数j的倍数,那么 i*prime[j+1]会被prime[j]筛掉。
同理j+1后边的数也会被prime[j]筛掉。