当我真正理解素数线性筛法

参考自:点击链接 主要代码:

const int MAXN = 10000010; bool com[MAXN]; int primes, prime[MAXN/10]; void solve(int n) {primes = 0;memset(com,false,sizeof(com));com[0] = com[1] = true;for (int i = 2; i <= n; ++i){if (!com[i]){prime[++primes] = i;}for (int j = 1; j <= primes && i*prime[j] <= n; ++j){com[i*prime[j]] = true;if (!(i % prime[j]))break;}} } 现在具体讲解一下证明:最难理解的是:; 要从下面两个方面:每个数至少被访问一次每个数至多被访问一次进行理解.对于质数,一定会在i的循环中访问到,并确定为质数。对于合数,一定可以分解为一个最小素因子和其他数的乘积。比如:合数 i = p(最小素因子)* a;若 i%prime[k] ==0;则 p * a * prime[k+1] 可以被后面的 a * prime[k+1] 再乘以素数 p 筛选出来,,(显而p<prime[k+1]) 所以i%prime[k] == 0 时要停止。

而有的旅行是释放负面情绪,换个心情,轻装上阵。

当我真正理解素数线性筛法

相关文章:

你感兴趣的文章:

标签云: