Cod sursa(job #1123266)

Utilizator eraser_aCarp Andrei eraser_a Data 25 februarie 2014 23:59:24
Problema Fractii Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX_COUNT 500000
FILE *in, *out;

long primes[MAX_COUNT];
long count = 0;
long init_sum = 1;

long calculate_totient(long n)
{
	long sqrt_n = n/2 + 1;
	long i = 0;
	long p_product = 1;
	int found = 0;
	while(primes[i] < sqrt_n && i<count)
	{
		if(n % primes[i] == 0)
		{
			p_product *= (primes[i] - 1);
			n = n / primes[i];
			found = 1;
		}
		i++;
	}
	
	if(!found) // the number is prime
	{
		primes[count++] = n;
		return n-1;
	}
	
	return (long)(p_product *  n );
}


long calculate_fractions(long n)
{
	long i = 1;
	if(n==1)
		return init_sum;

	while(i<n)
	{
		init_sum += calculate_totient(i+1)<<1;
		i++;
	}
	return init_sum;
}

int main()
{
	long result,n ;
	in = fopen("fractii.in","r");
	fscanf(in,"%ld",&n);
	fclose(in);
	
	result = calculate_fractions(n);
	out = fopen("fractii.out","w");
	fprintf(out,"%ld",result);
	fclose(out);
	return 0;
}