Cod sursa(job #865546)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 26 ianuarie 2013 17:13:53
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <bitset>

using namespace std;

//Vectorul pentru Ciurul lui Eratostenes
bitset<1300005> ciur;

//k-ul din cerinta
int k;

//Functie ce intoarce raspunsul, folosind Ciurul lui Eratostenes
long long eratostenes()
{
	//Doua contoare
	long long int i,j;
	
	//Se marcheaza numerele pare
	for(i=4;i<=1300000;i+=2)
		ciur[i]=1;

	//Se numara cate numere prime au fost pana la pasul curent,
	//initializarea cu 1 survine de la faptul ca 2 e prim si nu il mai consideram in in urmatorul for
	int poz=1;
	
	//Se parcurg toate numerele de la 3 la 1300000, nu pana la sqrt(1300000)=1140,
	//caci numarul cautat poate fi mai mare de atat
	for(i=3;i<=1300000;i+=2) 
	{
		//Daca e prim
		if(ciur[i]==0)
		{
			//Ii marcam multipli mai mici ca 1300000, deci, daca i depaseste 1140, se omite oricum pasul acesta
			for(j=i*i;j<=1300000;j+=i)
				ciur[j]=1;
			
			//Se incrementeaza numarul de numere prime gasite
			poz++;
			
			//Daca avem destule numere prime, dam raspunsul egal cu patratul primului numar prim de dupa al k-lea
			if(poz==k+1)
				return (i*i);
		}
	}
	
	//Pentru a scapa de warning-uri, trebuie ca functia sa aiba un return 0; la sfarsit
	return 0; 
}

int main()
{
	//Deschiderea fisierelor de intrare si iesire
	ifstream fin("prim.in");
	ofstream fout("prim.out");
	
	//Citirea numarului de numere prime ce trebuie gasite
	fin>>k;
	
	//Afisarea raspunsului furnizat de functia de mai sus
	fout<<eratostenes()<<'\n';
	
	//Inchiderea fisierelor de intrare si iesire
	fin.close();
	fout.close();
	return 0;
}