Pagini recente » Cod sursa (job #1944391) | Cod sursa (job #523844) | Cod sursa (job #2796807) | Cod sursa (job #2519062) | Cod sursa (job #2692452)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ciur.in");
ofstream fout("ciur.out");
inline int ciur(int limit, vector <int> &prim){
bool mark[limit + 1];
memset(mark, true, sizeof(mark));
int primnumber = 0;
for(int i = 2; i * i < limit; ++i){
if(mark[i] == true){
for(int j = i * i; j < limit; j += i){
mark[j] = false;
}
}
}
for(int i = 2; i < limit; ++i){
if(mark[i] == true){
prim.push_back(i);
primnumber++;
}
}
return primnumber;
}
inline void sitasegmentata(int n){
int limit = floor(sqrt(n)) + 1;
vector <int> prim;
int primnumber = ciur(limit, prim);
int low = limit, high = 2 * limit;
while(low < n){
if(high >= n){
high = n;
}
bool mark[limit + 1];
memset(mark, true, sizeof(mark));
for(int i = 0; i < prim.size(); ++i){
int LoLim = floor(low / prim[i]) * prim[i];
if(LoLim < low){
LoLim += prim[i];
}
for(int j = LoLim; j < high; j += prim[i]){
mark[j - low] = false;
}
}
for(int i = low; i < high; ++i){
if(mark[i - low] == true){
primnumber++;
}
}
low += limit;
high += limit;
}
fout << primnumber;
}
int main(){
int n;
fin >> n;
sitasegmentata(n);
return 0;
}