求解析未知代码——与素数筛有关
  • 板块学术版
  • 楼主liyancen
  • 当前回复6
  • 已保存回复8
  • 发布时间2024/10/25 15:51
  • 上次更新2024/10/25 17:39:02
查看原帖
求解析未知代码——与素数筛有关
930810
liyancen楼主2024/10/25 15:51
#include<bits/stdc++.h>
using namespace std;

long long n, p[340000], v[340000];

void solve(){
	long long i,j,m;
    for(m=1;m*m<=n;m++){
        p[m]=n/m-1;
	}
    for(i=1;i<=m;i++){
    	v[i]=i-1;
	}
    for(i=2;i<=m;i++){
        if(v[i]==v[i-1]) continue;
        for(j=1;j<=min(m-1,n/i/i);j++){
            if(i*j<m) p[j]-=p[i*j]-v[i-1];
            else p[j]-=v[n/i/j]-v[i-1];
		}
        for(j=m;j>=i*i;j--){
            v[j]-=v[j/i]-v[i-1];
		}
    }
}

int main(){
    while(scanf("%lld",&n)!=EOF){
        solve();
        printf("%lld\n",p[1]);
    }
    return 0;
}

我们现在只知道这是一个可以求出小于n的质数的个数,并且时间复杂度在 O(n^(1/3))到 O(n^(2/3))之间,但是看不懂这是在干啥,也不知道所用的数学依据是什么,求解答。

2024/10/25 15:51
加载中...