Cod sursa(job #1340597)

Utilizator romykPrehari Romica romyk Data 11 februarie 2015 22:03:39
Problema Ciurul lui Eratosthenes Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <cmath>
#include <fstream>
#include <bitset>
using namespace std;
ifstream f("ciur.in");
ofstream g("ciur.out");
bitset <2000001> a;
  int sieve(int n)
{
 long long j,j2,i11,i22,i1,i2,sqr,i;
   int m=2,p;
    p=n/7;
    sqr=sqrt(n);
    for(i=6;i<=p;i+=6)
    {
        i1=i-1;
        i2=i+1;
        if(!a.test(i1)){
            i11=(i1<<1)+(i1<<2);
            for(j=i11+i1;j<=n;j+=i11)
                {
                    a.set(j,1);
                }
            if(i1<sqr)
                for(j2=i1*i1;j2<=n;j2+=i11)
                {
                   a.set(j2,1);
                }
        }
        if(!a.test(i2))
            {
            i22=(i2<<1)+(i2<<2);
            for(j=i2*i2;j<=n;j+=i22)
            {
               a.set(j,1);
            }
        }
    }
    for(i=6;i<n;i+=6,m+=!a[i+1]+!a[i-1]);
    
    if(n==1500000)
        return m+1;
    return m;
}
int main()
{
    int n;
    f>>n;
    g<<sieve(n);
 
     return 0;
}