埃拉托斯特尼筛法的时间复杂度是O(n*lglgn)
bool vis[maxn];//能否被 素数合成
//int prime[maxn], cnt = 0;
void Prime(int num) {
for (int i = 2; i < maxn; i++) {
if (vis[i]) continue;
// prime[++cnt] = i;
for (int j = 2; j < maxn; j += i) {
vis[j] = true;
}
}
}
线性筛 接近O(n)
bool vis[maxn];//能否被 素数合成
int prime[maxn], cnt = 0;
void Prime(int num) {
for (int i = 2; i < maxn; i++) {
if (!vis[i]) prime[++cnt] = i;
for (int j = 1; j <= cnt && i * prime[j] < maxn; j++) {
vis[i * prime[j]] = true;
if (i % prime[j] == 0) break;
/*
这里的意义相当重要
埃筛法比线性筛法久的原因在于在去除 素数可以组成的合数 的过程
一个合数可能由多个 不同 质因数的次方 相乘
而一个合数 可以看作为 一个最小素数与另一个数的乘积
i 无论是作为一个 prime 还是合成的
设 i 最大质因数的下标为 k
那么 i 下一步相乘的步骤 只能为在 1 到 k 里面选择一个素数
为了不耗费太多时间 增加了一个 prime[k]就停止,不然跟埃筛法没太多区别
当前在 数轴 7^7 这个点上,去除的点最多 7^8 如果考虑到 7^7 * 11
会在之后 7^6 * 11 这个点上重复
*/
}
}
}
附带的是 偶数位数的回文 必定是 11 的倍数 ( 除了11 都是合数 ), 先证 一个数奇偶位和 的差 是11的倍数,则这个数为11的倍数
证: dn dn-1 dn-2 ... d3 d2 d1
每一位的贡献 为 dn * 10^(n-1)
要想这一位的贡献是11的倍数 则加上 dn * 10^(n-2)
那么原本 dn-1 的贡献从 dn-1 * 10 (n-2) 变为了 (dn-1 - dn) * 10^(n-2)
再进行上两行步骤 dn-2的贡献变为了 (dn-2 - (dn-1 - dn) ) * 10^(n-3) = (dn-2 - dn-1 + dn) * 10^(n-3)
递推得到 最后一项 应该为 +- (dn - dn-1 + dn-2 ... d3 - d2 + d1)* 10^0
所以设一个偶数位的回文数 sn sn-1 sn-2 sn-3 ... s3 s2 s1 s1 s2 s3 ... sn-3 sn-2 sn-1 sn
每间隔一个数字取走求和, 在经过对称点s1 下一步会变成s2 然后 下标+2, 由对称性得 从s2 开始也是一样, 所以奇数位的 等于 偶数位的和 等于 s1 + s2 + s3 +... sn
所以偶数位的回文数 为 11 的倍数
//挺闲的