Cod sursa(job #144628)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 27 februarie 2008 20:19:10
Problema Ciurul lui Eratosthenes Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 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[1024];



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=n/2;
         if (n%2==0){
                i--;}
         while (i>=1){
                if (((v[i>>3]>>(i & 7))& 1)==0){
                        nrs++;
                        if (nrs<=1000)sol[nrs]=2*i+1;
                }
                i--;
                }

}


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


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