初级中的初级数论模板及解析

线性筛法

因为复杂度为线性复杂度,所以叫线性筛法
虽然我看不出来哪里是线性了,但真真实实就是线性。
日常感叹自己好蔡┭┮﹏┭┮

prime[i]数组储存第i个质数
qwe[i]储存i的最小质因子
因为一个数n可以看成最小质因子q与最大因子i的乘积
n=p·q
所以可以借助这一点,确定下i的值然后增加q向后筛!
比如i=15 就可以筛出 15×2=30 15×3=45
当然啦,有些小细节是很需要注意的
首先呢 是要时刻保证q是n的最小质因子 其实不保证也可以,只不过就不是线性筛法了,会大大滴增加复杂度
其次呢 是要注意q*i不能>maxn造成数组越界!

const int maxn=6666;
int prime[maxn];
int qwe[maxn];
void qprimes()
{
    memset (prime,0,sizeof(prime));
    memset (qwe,0,sizeof(qwe));
    int tmp=0;
    for (int i=2;i<=maxn;i++)
    {
        if (qwe[i]==0)
            qwe[i]=prime[++tmp]=i;
        for (int j=1;j<=tmp;j++)
        {
            if (prime[j]*i>maxn||prime[j]>qwe[i])
                break;
            qwe[i*prime[j]]=prime[j];
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43925900/article/details/95310117