Cod sursa(job #710665)

Utilizator valentin.ccvalentin craciun valentin.cc Data 10 martie 2012 16:00:00
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio> 
#define LE 1050000 
#define ll long long 
using namespace std; 
int A=1,W[LE],n,i,prim[LE],j,k,t,tt[LE]; 
ll rez; 
int pinex(int e) 
{ 
    
int L=1LL<<e,P=1,T=0,val=1,R=0,y,t,NR=0; 
    
for(y=1; y<L; ++y,val=y,NR=0,P=1) 
    
{ 
        
for(t=1; val; val/=2,++t) 
            
if (val%2) P*=W[t],NR++; 
        
if (NR%2) R+=n/P; 
        
else R-=n/P; 
    
} 
    
return n-R; 
} 
int main() 
{ 
    
freopen("fractii.in","r",stdin); 
    
freopen("fractii.out","w",stdout); 
 
 
    
scanf("%ld",&n);  
 
    
for(i=2; i*i<=n; ++i) if (tt[i]==0) 
            
for(j=i*i; j<=n; j+=i) tt[j]=1; 
 
 
    
for(i=2;i<=n;++i) if (tt[i]==0) 
 
prim[++k]=i; 
 
 
    
for(i=1; i<=n; ++i,A=i,t=0) 
    
{ 
        
for(j=1; prim[j]*prim[j]<=A&&j<=k; ++j) 
            
if (A%prim[j]==0) 
            
{ 
                
W[++t]=prim[j]; 
                
while (A%prim[j]==0) A/=prim[j]; 
            
} 
        
if (A!=1) W[++t]=A; 
        
rez+=pinex(t); 
    
} 
    
printf("%lld\n",rez); 
    
return 0; 
}