Cod sursa(job #711212)

Utilizator cosminnicaAruxandei Cosmin Andrei cosminnica Data 11 martie 2012 17:32:17
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 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,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; 
}