Cod sursa(job #481164)

Utilizator budulaiSuman Dinu budulai Data 30 august 2010 19:42:56
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int power(int x, int pow)
{
	if(pow==0) return 1;

	int rez=x;
	while(pow>1)
	{
		rez*=x;
		pow--;
	}
	return rez;
}

int prime(int n, char* &a, int* &b)
{
	int nr=1; 
	long long int i,j;
	a = (char *)calloc(n/2+2,sizeof(char));
	for(i=3;i<=n;i+=2)
	{ 
		if(a[(i+1)/2] == 0)
		{
			nr++;	
			for(j=i*i; j<=n; j+=(i<<1)) 
			   a[(j+1)/2] = 1;
		} 
	}

	b = (int *)calloc(nr, sizeof(int));
	b[0] = 2;
	j=1;
	for(i=3;i<=n;i+=2)
		if(a[(i+1)/2]==0) b[j++] = i; 

	return nr;
}

int fi(int x, int b[])//x -valoarea, b - array cu nr prime 
{
	//descompune in factori primi
	int a[10][2], n=0, i=0, j, rez=1, last =-1;
	while(x>1)
	{
		if(x%b[i] == 0)
		{
			//for(j=0;j<n;j++) if(a[j][0] == b[i]) break;
			//if(n>0 && a[n-1][0] == b[i]) 
			if(i==last) a[n-1][1]++;
			else 
			{
				a[n][0] = b[i];
				a[n][1] = 1;
				n++;
				last = i;
			}
			//if(j>=n) { a[j][0] = b[i]; a[j][1] = 1; n++;}
				//else a[j][1]++;
			
			x /= b[i];
		}
		else i++;
	}

	for(i=0; i<n; i++)
		rez *= (a[i][0]-1)*power(a[i][0],a[i][1]-1);

	return rez;
}

int main()
{
	long int n, n2;
	int *b;
	char *a;
	freopen("fractii.in", "r", stdin);
	//freopen("fractii.out", "w", stdout);
	scanf("%d", &n);
	n = 1000000;
	n2 = prime(n, a, b);
	//printf("%d",n2);
	int i;
	long long int rez=1; //for prime number 2

	//printf("sof= %d",sizeof(a));
	for(i=3;i<=n;i++)
		if(i%2==1 && !a[(i+1)/2]) rez += i-1;
		else rez+=fi(i,b);

	printf("%lld",rez*2+1);

	return 0;
}