Cod sursa(job #217146)

Utilizator saululflorin saulul Data 27 octombrie 2008 11:17:45
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>  
//include <conio.h>  
//#include <math.h>  
#include <stdlib.h>

   
#define NMAX 1000000/2+1  
long n;  
char p[NMAX];   
  
void citire()  
     {  
     FILE *fin;  
     fin=fopen("fractii.in","rt");  
     fscanf(fin,"%ld",&n);  
     fclose(fin);  
     }  
   
 /*void ciur1() 
     { 
  
      
     for(long i=3;i<=n;i+=2) 
         if (p[i]==0)            //p[i]==0 ==> i is prime, singurul numar prim par este 2 
             for(long j=3*i;j<=n;j+=i<<1) 
                 p[j]=1; 
      
     }*/  
     
  void ciur2()  
      {  
      //p[i]=0 daca 2*i+1 este prim  
      for(long i=1;(i<<1)+1<=n;++i)  
          {  
          if(0==p[i])  
              {  
                  for(long j=i+i+i+1;(j<<1)+1<=n;j+=(i<<1)+1)  
                          p[j]=1;   
              }  
          }  
      }  
    
    
  long totient(long n)  
  {  
  float tot=n;  
    
  if (2==n) return 1;  
  if ((3==n)||(4==n)||(6==n)) return 2;  
  if(5==n) return 4;  
  if (0==(n%2))  
      tot=tot*(1-(1/2.0));  
  for(long i=1;(i<<1)+1<=n;++i)  
      if(0==p[i])  
          {  
          for(long j=i+i+i+1;(j<<1)+1<=n;j+=(i<<1)+1)  
                          p[j]=1;   
          if(0==n%((i<<1)+1))  
              tot*=(1-1.0/((i<<1)+1));  
          }  
  return (long)tot;  
  }  
    
  void calculeaza()  
  {  
  long long rez=0;  
  FILE * fout;  
 for(long i=2;i<=n;++i)  
      rez+=totient(i);  
    
  rez=(rez<<1)+1;  
  fout=fopen("fractii.out","wt");  
  fprintf(fout,"%lld",rez);  
  fclose(fout);  
    
 }  
    
 int main(int argc, char ** argv)  
      {  
      int cit;
     citire();  
     //printf("merge citirea...\nn= %ld \n", n);
     ciur2();  
     calculeaza();  
     //printf("n= %ld\n",n);  
     //printf("lungimea lui bool este %d octeti\n",sizeof(char));  
     //printf("lungimea lui long long este %d octeti\n",sizeof(long long));  
     //getchar(); 
     //getch();
     }