UOJ Logo kczno1的博客

博客

求助

2017-12-20 14:19:49 By kczno1

我想知道怎么求$[1,10^{11}]$内的质数个数

在网上找到如下代码,但不知道什么意思,希望有会的人能告诉我

#include <bits/stdc++.h>  
#define ll long long  
using namespace std;  
ll f[340000],g[340000],n;  
void init(){  
    ll i,j,m;  
    for(m=1;m*m<=n;++m)f[m]=n/m-1;  
    for(i=1;i<=m;++i)g[i]=i-1;  
    for(i=2;i<=m;++i){  
        if(g[i]==g[i-1])continue;  
        for(j=1;j<=min(m-1,n/i/i);++j){  
            if(i*j<m)f[j]-=f[i*j]-g[i-1];  
            else f[j]-=g[n/i/j]-g[i-1];  
        }  
        for(j=m;j>=i*i;--j)g[j]-=g[j/i]-g[i-1];  
    }  
}  
int main(){  
    cin>>n;
        init();  
        cout<<f[1]<<endl;  
    return 0;  
}

评论

Misaka10032
任之洲《积性函数求和的几种方法》

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。