Cod sursa(job #42947)

Utilizator Bluedrop_demonPandia Gheorghe Bluedrop_demon Data 29 martie 2007 17:37:49
Problema Fractii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
// Problema fractii

#include <stdio.h>
#define MAX       1000001

char p[MAX];
short prim[MAX];

long tot( long m )
{
     long i, rez = m;
     for( i=2; i<=m; i++ )
          if( !(m%i) && (prim[i]) )
              {
                     rez /= i;
                     rez *= (i-1);
              } 
     return rez;
}

int main()
{
    freopen( "fractii.in", "rt", stdin );
    long n;  
         scanf( "%ld", &n );
    fclose( stdin );
  long i, j;   
  for (i = 1; ((i * i) << 1) + (i << 1) <= n; i += 1) {         
    if ((p[i >> 3] & (1 << (i & 7))) == 0) {   
      for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= n; j += (i << 1) + 1) {   
        p[j >> 3] |= (1 << (j & 7));   
      }   
    }   
  } 
  prim[2] = 1;
  for (i = 1; 2 * i +1<= n; ++i)     
       if ((p[i >> 3] & (1 << (i & 7))) == 0)    
          prim[2*i+1] = 1;
          
  long nr = 1;
  for( i=2; i<=n; i++ )
       nr += 2*tot( i );
       
       freopen( "fractii.out", "wt", stdout );
                printf( "%ld\n", nr );
       fclose( stdout );
  
    return 0;
    
}