Cod sursa(job #480910)

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

int power(int x, int pow)
{
	int rez=x;

	if(pow==0) return 1;

	while(pow>1)
	{
		rez*=x;
		pow--;
	}
//	printf("power %d la %d = %d",x,pow,rez);
	return rez;
}

int prime(int n, int* &b)
{
	int nr=1; 
	long long int i,j;
	//long long int j;
	char *a = (char *)calloc(n/2+2,sizeof(char));
	//char a[] = new char(100); 
		//calloc(n,sizeof(char));
		//new(char[n]);

	/*
	a[0] = 0; //prim
	a[1] = 0; //prim
	*/

	//n=10 si 9 ori 7
	//1=1 2=2 3=3 4=5 5=7 6==9
	for(i=3;i<=n;i+=2)
	{ //i*2-1
		//printf("%d\n",i);
		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; 

	//b = (int *)calloc(1,sizeof(int));
	//*b = 5;
	//first ; 1.000.000.000 => 90 sec rez = 50847534 nr prime
	//nr = 0; //length = n
	//for(i=2;i<=n;i++)
	//{
	//	if(a[i] == 0)
	//	{
	//		nr++;	
	//		for(j=(i<<1); j<=n; j+=i) a[j] = 1;
	//	}
	//}

	//second; 1.000.000.000 => 45 sec; rez = 
	//	for(i=3;i<=n;i+=2)
	//{ //i*2-1
	//	//printf("%d\n",i);
	//	if(a[(i+1)/2] == 0)
	//	{
	//		nr++;	
	//		for(j=i*i; j<=n; j+=(i<<1)) 
	//		   a[(j+1)/2] = 1;

	//	} 
	//}

	//printf("\n%d nr prime\n",nr);
	//for(i=0;i<n;i++)
	//{
	//	printf("%d ",a[i]);
	//}

	return nr;
}

//void pp(int &b)
//{
//	printf("%d ", b);
//}

int fi(int x, int b[])
{
	//descompune in factori primit
	int a[10][2], n=0, i=0, j, rez=1;
	for(i=0;i<10;i++) a[i][1]=0;
	i=0;
	while(x>1)
	{
		if(x%b[i] == 0)
		{
			for(j=0;j<n;j++) if(a[j][0] == b[i]) break;
			if(j>=n) { a[j][0] = b[i]; n++;}
			a[j][1]++;
			x /= b[i];
		}
		else i++;
	}
	//printf(" n= %d, %d\n",n, a[0][0]);

	//rez = 0;

	for(i=0; i<n; i++)
//	{
	//	printf("%d %d\n",a[i][0], a[i][1]);
		rez *= (a[i][0]-1)*power(a[i][0],a[i][1]-1);
	//}
	return rez;
}

int main()
{
	//time_t time1, time2;
	//int i,j;
	long int n, n2;
	//int a[250000]; //nr prime
	//int b[10]; //descompunere
	int *b;
	freopen("fractii.in", "r", stdin);
	//freopen("fractii.out", "w", stdout);
	scanf("%d", &n);
	//printf("%d \n",sizeof(n));
	//printf("%d",n);
	//n=120;
	//n=7;
	//printf("%d",n);
	//time1 = time(NULL);
	n2 = prime(n, b);
	//time2 = time(NULL);
	//printf("\ndiff sec %d\n",time2-time1);

	int i, rez=1;

	//if(n==1) rez = 1;
	for(i=2;i<=n;i++)
	//{ printf("i= %d, fi= %d\n",i, fi(i,b));
		rez+=2*fi(i,b);
	//}

	printf("%d",rez);
//	for(i=0;i<n2;i++)
//		printf("%d fi= %d\n",b[i], fi(b[i],b));

	//printf("b= %d",*b);
	//pp(*b);
	//descompunere
/*	while(n>1)
	{
		//descompune;
	}
*/
	//printf("size of sum %d\n",sizeof(sum));
	//for(i=1;i<1000000000;i++) sum+=i;
		//for(j=2;j<i/2;j++) sum+=j;
	//printf("sum= %lld",sum);
	return 0;
}