Cod sursa(job #2092491)

Utilizator arcoC. Nicolae arco Data 21 decembrie 2017 19:49:14
Problema Fractii Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <stdint.h>
#include <math.h>

typedef unsigned int uint;

uint euler(uint n);
bool is_prime(uint n);
uint phi(uint n);

int main(void)
{
	FILE *in = fopen("fractii.in", "r");
	FILE *out = fopen("fractii.out", "w");
	if(in != NULL && out != NULL)
	{
		uint n;
		uint s = 0;
		fscanf(in, "%u", &n);
		
		uint i = 1;
		for(; i <= n; i++)
		{
			s += euler(i);
		}
		fprintf(out, "%u\n", (2 * s) - 1);

		fclose(in);
		fclose(out);
	}
	else
	{
		printf("Error\n");
	}

	return 0;
}

bool is_prime(uint n)
{
	if((n == 1) || (n % 2 == 0 && n != 2))
	{
		return false;
	}
	else
	{
		uint i = 2;
		for(; i * i <= n; i++)
		{
			if(n % i == 0)
			{
				return false;
			}
		}

		return true;
	}
}

uint euler(uint n)
{
	if(is_prime(n))
	{
		return n - 1;
	}
	else
	{
		return phi(n);
	}
}

uint phi(uint n)
{
	uint c = 1;
	uint d = 2;
	while(n > 1)
	{
		uint p = 0;
		while(n % d == 0)
		{
			p++;
			n /= d;
		}
		if(p)
		{
			c *= (d - 1) * ((uint)pow(d, p - 1));
		}
		d++;
		if(n > 1 && d * d > n)
		{
			d = n;
		}
	}

	return c;
}