目前顶部两个题解指出埃筛的时间复杂度是 O(NlogN),并且给出一篇"证明"。
显然调和级数是 O(lnN) 的,这篇"证明"证明了一个比调和级数小的数是 O(logN) 的,并不能说明问题。(并且证明的非常诡异,最后一步 H10m−1−80 在数据范围内甚至很大范围内都是一个负数
如果我们用代码统计实际运算次数,事实上在很大范围内实际次数都是 <2N 的。
希望题解给出一个更严谨的结论/证明
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 100000005
using namespace std;
bool f[N], g[N];int nxt[N], n = N - 5;
int main(){
rep(i, 1, n)f[i] = f[i / 10] | (i % 10 == 7);
int sum = 0;
rep(i, 1, n){
if(g[i] || !f[i])continue;
for(int j = i; j <= n; j += i)g[j] = 1, sum ++;
}
printf("%d\n", sum);
/*pre(i, n, 1)if(!g[i + 1])nxt[i] = i + 1; else nxt[i] = nxt[i + 1];
int T;scanf("%d", &T);
while(T--){
int x;scanf("%d", &x);
if(g[x])puts("-1");
else printf("%d\n", nxt[x]);
}*/
return 0;
}