Mai intai trebuie sa te autentifici.

Cod sursa(job #24853)

Utilizator AdixSuciu Adrian Adix Data 3 martie 2007 19:59:29
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#include <math.h>
#include <string.h>
  long nmax,nrprim;
  long fract;
	long p[1003],prim[800],npr[800];

void citire(){
		 FILE *in;
		 in=fopen("fractii.in","r");
		 fscanf(in,"%ld",&nmax);
		 fclose(in);
		 }


void scriere(){
     FILE *out;
     long fractsf;
     out=fopen("fractii.out","w");
     fractsf=(2*fract);
     fractsf=fractsf+1;
		 fprintf(out,"%ld",fractsf);
     fclose(out);          
     }
     
  long ciur(){
   long  i, j, nr = 0;
   for (i = 2; i <= nmax; ++i) {  
     if (p[i] == 0) {  
       nr++;  
			 for (j = i + i; j <= nmax; j += i) {
				 p[j] = 1;
			 }
		 }
	 }
	 return nr;
}
void vectprim(){
  long i,j;
j=1;
i=2;
while(j<=nrprim){
                 if(!p[i]) {prim[j]=i;j++;}
				   		    i++;
						 }
		 }

  long descfactprimi(long k){
  long i,j;
int b=1;
i=1;
j=0;
   while(k!=1){
               if(k%prim[i]==0){
								if(b){j++;
                                npr[j]=prim[i];
                                b=0;
                                }
                                k=k/prim[i];}
                    else {i++;b=1;}
               }
               
		 return j;
}

  long totient(long k){
  long i,nrprimi;
	double prod=k;
		nrprimi=descfactprimi(k);
		if(nrprimi==0) return 0;
//		if(k==npr[1]) return k;
		for(i=1;i<=nrprimi;i++)
		prod=prod*(1-(double)1/npr[i]);

		return (long)prod;
    }


void procesare(){
		   long i;
		   long tot;
		 nrprim=ciur();
		 vectprim();
		 fract=0;
		 for(i=1;i<=nmax;i++){
								tot=totient(i);
								fract=fract+tot;
																						}

															}

int main(){
		citire();
		procesare();
		scriere();

		 return 0;
		 }