Cod sursa(job #1312114)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 8 ianuarie 2015 21:59:43
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>
#define NMAX 1000023
int n, sum, arr[10023], c, s;
bool sieve[NMAX], check[10023];
FILE *fin, *fout;
void back(int a, int b, int g)
{
	if(g > c) return;
	if(b > a)
	{
		if(a%2)
		{
			for(int i = 0; i< c; i++)
			{
				if(check[i] == 0) continue;
				s -= n/(arr[i]*check[i]);
				fprintf(fout, "- %d a = %d\n", n/(arr[i]*check[i]), a);
			}
		}
		else
		{
			for(int i = 0; i< c; i++)
			{
				if(check[i] == 0) continue;
				s += n/(arr[i]*check[i]);
				fprintf(fout, "+ %d a = %d\n", n/(arr[i]*check[i]), a);
			}
		}
		return;
	}
	for(int i = g; i< c; i++)
	{
		if(check[i]) continue;
		check[i] = 1;
		back(a, b+1, i+1);
		check[i] = 0;
	}
}
int main()
{
	fin = fopen("fractii.in", "r");
	fout = fopen("fractii.out", "w");
	fscanf(fin, "%d", &n);
	for(int i = 2; i< NMAX; i++)
	{
		if(sieve[i] == 1) continue;
		for(int j = 2; j< NMAX; j++)
		{
			if(i*j >= NMAX) break;
			sieve[i*j] = 1;
		}
	}
	sum = n;
	for(int i = 2; i <= n; i++)
	{
		c = 0;
		for(int j = 2; j <= i; j++)
		{
			if(!sieve[j] && i%j == 0)
			{
				arr[c] = j;
				c++;
			}
		}
		for(int j = 0; j< c; j++) check[j] = 0;
		s = n;
		for(int j = 1; j<= c; j++)
		{
			fprintf(fout, "i = %d\n", i);
			back(j, 1, 0);
		}
		sum+=s;
	}
	fprintf(fout, "%d\n", sum);
	fclose(fin);
	fclose(fout);
	return 0;
}