Cod sursa(job #709793)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 8 martie 2012 16:35:19
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#define LE 1000800
using namespace std;
int A=1,W[LE],n,i,prim[LE],j,k,t,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<=n; ++i) if (prim[i]==0)
        {
            for(j=i+i; j<=n; j+=i) prim[j]=1;
            prim[++k]=i;
        }

    for(i=1; i<=n; ++i,A=i,t=0)
    {
        for(j=1; prim[j]*prim[j]<=i&&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("%ld\n",rez);
    return 0;
}