Cod sursa(job #1693821)

Utilizator ZanoxNonea Victor Zanox Data 23 aprilie 2016 22:14:34
Problema Fractii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <iostream>

struct lst
{
    int i1;
    lst *urm,*prec;
}*dp[1000000],*l;

int i,j,k,n,v[8],m,sign,p,prez[1000000],indv;
long long sol,sol1,cell;

using namespace std;

fstream f,g;

void bkt(int i)
{
    if(i<=m)
    {
        p*=v[i];
        sign=!sign;
        bkt(i+1);

        p/=v[i];
        sign=!sign;
        bkt(i+1);
    }
    else sol1+=(-1+2*sign)*(n-n/p);
}

int main()
{
    f.open("fractii.in",ios_base::in);
    g.open("fractii.out",ios_base::out);
    f>>n;
    for(i=2;i<=n;i++)
    {
        dp[i]=new lst;
        dp[i]->urm=dp[i];
        dp[i]->prec=dp[i];
    }
    for(i=2;i<n;i++)if(dp[i]->urm==dp[i])for(j=i*2;j<=n;j+=i)
    {
        l=new lst;
        l->i1=i;
        l->urm=dp[j];
        l->prec=dp[j]->prec;
        dp[j]->prec->urm=l;
        dp[j]->prec=l;
    }
    sol=n;
    p=1;
    sign=0;
    for(i=2;i<=n;i++)if(prez[i]==0)
    {
        if(dp[i]->urm==dp[i])
        {
            m=1;
            v[1]=i;
        }
        else for(m=0,l=dp[i]->urm;l!=dp[i];l=l->urm,m++)v[m+1]=l->i1;
        sol1=0;
        bkt(1);
        indv=1;
        for(l=dp[i]->urm;l!=dp[i];l=l->urm)
        {
            k=l->i1;
            for(j=0,cell=i*k;cell<=n;cell*=k,j++)prez[cell]=1;
            indv+=j;
        }
        sol+=indv*sol1;
    }
    g<<sol;
}