Problem Description
Easy question! Calculate how many primes between [1...n]!
Input
Each line contain one integer n(1 <= n <= 1e11).Process to end of file.
Output
For each case, output the number of primes in interval [1...n]
Sample Input
2 3 10
Sample Output
1 2 4
上网搜的模板,CF有原题。
看了几个代码都100多行的,这个时间复杂度低一些
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 340000
using namespace std;
long long int a[N],g[N],n;
void init(){
long long int i,j,m;
for(m=1;m*m<=n;m++) a[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) a[j]-=a[i*j]-g[i-1];
else a[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(){
while(scanf("%lld",&n)!=EOF){
init();
printf("%lld\n",a[1]);
}
return 0;
}