对高赞题解复杂度的质疑&求证复杂度
查看原帖
对高赞题解复杂度的质疑&求证复杂度
125454
CLCA_楼主2021/12/1 23:20

目前顶部两个题解指出埃筛的时间复杂度是 O(NlogN)\mathcal{O}(N\log N),并且给出一篇"证明"

显然调和级数是 O(lnN)\mathcal{O}(\ln N) 的,这篇"证明"证明了一个比调和级数小的数是 O(logN)\mathcal{O}(\log N) 的,并不能说明问题。(并且证明的非常诡异,最后一步 H10m180H_{10^m-1} - 80 在数据范围内甚至很大范围内都是一个负数

如果我们用代码统计实际运算次数,事实上在很大范围内实际次数都是 <2N<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;
}
2021/12/1 23:20
加载中...