Cod sursa(job #83280)

Utilizator mordredSimionescu Andrei mordred Data 10 septembrie 2007 18:28:02
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdlib>
#include<string>

char primeFlagsAux[1000000];
long primeFlags[1000000];
long phiFlags[1000000];

void getTheNumber(long n) {  
long long i, j,nr = 1;
primeFlags[2]=1;  
for (i = 1; ((i * i) << 1) + (i << 1) <= n; i += 1) {        
    if ((primeFlagsAux[i >> 3] & (1 << (i & 7))) == 0) {  
        for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= n; j += (i << 1) + 1) {  
         primeFlagsAux[j >> 3] |= (1 << (j & 7));  
       }  }  }  
   for (i = 1; 2 * i + 1 <= n; ++i)    
        if ((primeFlagsAux[i >> 3] & (1 << (i & 7))) == 0)   
            primeFlags[2*i+1]=1;}
            
int main()
{
freopen("fractii.in","r",stdin);freopen("fractii.out","w",stdout);
long n,i,j,nr;

scanf("%ld\n",&n);

getTheNumber(n);

for(i=1;i<=n;i++)phiFlags[i]=i;

for(i=2;i<=n;i++)
    if(primeFlags[i])
        {
         phiFlags[i]=i-1;
         j=2;
         while(i*j<=n){
            phiFlags[i*j]=(phiFlags[i*j]*(i-1))/i;j++;}   
        }//for(i=0;i<100;i++)printf("%d\t%d\t%d\n",i,primeFlags[i],phiFlags[i]);

for(i=1,nr=-1;i<=n;i++)
    {
     nr+=phiFlags[i]*2;   
    }

printf("%ld\n",nr);

return 0;    
}