Cod sursa(job #709806)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 8 martie 2012 16:48:09
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 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;
}