Cod sursa(job #1631954)

Utilizator on_a_mission_without_permissionUPB Bolohan Dinu Rotaru on_a_mission_without_permission Data 5 martie 2016 20:18:28
Problema Fractii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
// problema incearca sa afle numarul de fractii distincte a/b cu a,b < n
// foloseste Sieve of Erathosthene

#include<stdio.h>
#include<vector>
using namespace std;
//long long prime[100000];
int nr_prime;
vector<long> prime;
void calculeazaprime(){
	long long i,j;
	int gasit;
	nr_prime = 0;
	for( i = 2; i <= 1000000; i++){
		gasit = 0;
		for( j = 0; j < nr_prime; j++)
			if( i % prime[j] == 0){
				gasit = 1;
				break;
			}
		if( gasit == 0)
			prime[nr_prime++] = i;
	}
}
void calculeazaprime2(){
	char b[1000000];
	long i, j;
	for( i = 0; i < 1000000; i++)
		b[i] = 1;
	for( i = 2; i < 1000000; i++){
		if( b[i] ){
			prime.push_back(i);
			for(j = 2; j <= 1000000 / i; j++)
				b[i * j] = 0;
		}
	}
}
long long nr_rel_prim(long nr){
//	printf("mi-a intrat in functie cu nr = %ld \n", nr);
//	return 0;
	long long ret;
	ret = 1;
	long i, prim;
	i = 0;
	while( nr >= prime[i] * prime[i]){
//		printf("compar %ld cu %ld\n", nr, prime[i]);
		prim = prime[i];
		if( nr % prim == 0){
			nr /= prim;
			ret *= (prim - 1);
			while( nr && (nr % prim == 0) ){
				nr /= prim;
				ret *= prim;
			}
		}
		i++;
	}
	if( nr > 2)
		ret *= (nr - 1);
//	printf("pt nr = %lld returnez %lld\n",nr, ret);
	return ret;
}
int main(){
	long n;
	long long rez;
	rez = 0;
	FILE *f = fopen("fractii.in", "r");
	fscanf(f, "%ld", &n);
	fclose(f);
//	printf("n = %ld\n", n);
	long i;
	calculeazaprime2();
//	printf("aici n = %ld\n", n);
//	return 0;
//	printf("mi-a iesit din functio\n");
	rez++;
	for( i = 2; i <= n; i++){
//		printf("aici i = %ld, n = %ld\n",i,n);
		rez += 2 * nr_rel_prim(i);
	}
	f = fopen("fractii.out", "w");
	fprintf(f, "%lld", rez);
	fclose(f);
	return 0;
}