Cod sursa(job #144591)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 27 februarie 2008 20:02:21
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#define FIN "ciur.in"
#define FOUT "ciur.out"
#define MAX_N 2000000
using namespace std;
int n,nrs;
char v[MAX_N/8];
int sol[2000001];



void ciur(int n){
        int i,j;
        i=1;
        while ((((i*i)<<1)+(i<<1))<=n){
                if (((v[i>>3]>>(i & 7))& 1)==0){
                        j=(((i*i)<<1)+(i<<1));
                        while (((j<<1)+1)<=n){
                                v[j>>3]=v[j>>3] | (1 << (j & 7));
                                j+=(i<<1)+1;
                        }
                }
                i++;
         }
         i=1;
         while ((2*i+1)<=n){
                if (((v[i>>3]>>(i & 7))& 1)==0){
                        nrs++;
                                sol[nrs]=2*i+1;
                }
                i++;
                }

}


void iofile(void){
        freopen(FIN,"rt",stdin);
        freopen(FOUT,"wt",stdout);
        scanf("%d",&n);
        nrs=1;
        sol[1]=2;
        ciur(n);
        printf("%d\n",nrs);
        if (nrs<=1000){
        for (int i=1;i<=nrs;i++){
                printf("%d ",sol[i]);
                } }   else{
                        for (int i=nrs-1000+1;i<=nrs;i++){
                                printf("%d ",sol[i]);
                        }
         }
        fclose(stdin);
        fclose(stdout);
}


int main(void){
        iofile();
        return 0;
}