Cod sursa(job #1273486)

Utilizator Mihai96Saru Mihai Mihai96 Data 22 noiembrie 2014 15:29:11
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

const char INPUT_FILENAME[]="fractii.in";
const char OUTPUT_FILENAME[]="fractii.out";

int numaraFractii(int n){
	vector<bool> *nr_prime = new vector<bool>(n+1);
	int nr_fractii = (n-1)*2; // pentru fiecare numar k din intervalul [2, n] exista fractiile: 1/k si k/1
	nr_fractii += 1;        // exista fractia 1/1
	int nr_prime_gasite = 0;
	int nr_multipli;

	//marchez toate numerele impare ca fiind prime
	for(int i = 3; i <= n; i += 2){
		(*nr_prime)[i] = true;
	}

	//iau separat cazul numarului prim 2
	nr_multipli = n/2;
	// (n-1) deoarece se iau in considerare toate numerele din intervalul [2, n]
	nr_fractii += ((n-1) - nr_multipli - nr_prime_gasite) * 2;
	++nr_prime_gasite;
	
	int i;
	for(i = 3; i*i <= n; i += 2){
		if((*nr_prime)[i] == true){
			for(int j = i*i; j <= n; j += i*2){
				(*nr_prime)[j] = false;
			}
		}
	}

	for(int j = 3; j <= n; j += 2){
		if((*nr_prime)[i] == true){
			nr_multipli = n/i;
			// (n-1) deoarece se iau in considerare toate numerele din intervalul [2, n]
			nr_fractii += ((n-1) - nr_multipli - nr_prime_gasite) * 2;
			++nr_prime_gasite;
		}
	}

	delete nr_prime;
	return nr_fractii;
}
	
	
	
int main(int argc, char *argv[]){
	int n;
	ifstream fin(INPUT_FILENAME);
	fin >> n;
	fin.close();

	int nr_de_fractii = numaraFractii(n);
	ofstream fout(OUTPUT_FILENAME);
	fout << nr_de_fractii;
	fout.close();

	return 0;
}