Cod sursa(job #53636)

Utilizator Omega91Nicodei Eduard Omega91 Data 22 aprilie 2007 19:25:45
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;

bool comp[1000001]={};
int n;
class Divizibilitate {
	public:
		void ciurulLuiEratostene();
		int cmmdc(int, int);
		bool primeIntreEle(int, int);
};

void Divizibilitate::ciurulLuiEratostene()
{
	int i, j;
	for (i = 4; i <= n; i+=2)
		comp[i] = 1;
	for (i = 3; i <= sqrt(n)+1; i+=2)
		if (!comp[i])
			for (j = i * 2; j <= n; j+=i)
				comp[j] = 1;
}
int Divizibilitate::cmmdc(int a, int b)
{
	int rest;
	while (b) {
		rest = a % b;
		a = b;
		b = rest;
	}
	return a;
}
bool Divizibilitate::primeIntreEle(int a, int b)
{
	if (cmmdc(a, b) == 1) return true;
	return false;
}

int main()
{
	FILE *f1, *f2;
	long long s=0;
	int i, j;
	Divizibilitate q;

	f1 = fopen("fractii.in", "r");
	f2 = fopen("fractii.out", "w");
	fscanf(f1, "%d", &n);
	q.ciurulLuiEratostene();
	s+=n;
	/*if (n >= 2) s+=n-n/2;
	//if (n >= 3) s+=n-n/3;
	if (n >= 4) s+=n-n/2;
	if (n >= 5) s+=n-n/5;*/
	//cout<<s;
	for (i = 2; i <= n; i++)
		if (comp[i])
		{
			for (j = 1; j <= n; j++)
				if (q.primeIntreEle(i,j)) s++;
		}
		else
			s += n - n / i;
	
			
	fprintf(f2, "%lld", s);
	fclose(f1);
	fclose(f2);
	
	return 0;
}