Cod sursa(job #1693951)

Utilizator ZanoxNonea Victor Zanox Data 24 aprilie 2016 13:11:24
Problema Fractii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <iostream>

using namespace std;

fstream f,g;

long long n,i,j,v[1000000],st[8],nrprime,sol,base,cell,fr,nr,sign,p,m;

void bkt2(int i)
{
    if(i<=m)
    {
        long long j;
        for(j=1;cell<=n;j*=v[st[i]],cell*=v[st[i]])bkt2(i+1);
        cell/=j;
    }
    else nr++;
}

void bkt3(int i)
{
    if(i<=m)
    {
        sign*=-1;
        p*=v[st[i]];
        bkt3(i+1);

        sign*=-1;
        p/=v[st[i]];
        bkt3(i+1);
    }
    else fr+=sign*(n-n/p);
}

void bkt1(int i)
{
    nr=0;fr=0;
    cell=base;
    bkt2(1);
    bkt3(1);
    sol+=nr*fr;
    m++;
    for(st[i]=st[i-1]+1,base*=v[st[i]];st[i]<=nrprime&&base<=n;st[i]++,base=base/v[st[i]-1]*v[st[i]])bkt1(i+1);
    base/=v[st[i]];
    m--;
}

int main()
{
    //bkt1 face structura nr prime, bkt 2 face nr de fractii pt o structura, bkt 3 genereaza nrele cu aceea structura
    f.open("fractii.in",ios_base::in);
    g.open("fractii.out",ios_base::out);
    f>>n;
    for(i=2;i<=n;i++)if(v[i]==0)
    {
        nrprime++;
        v[nrprime]=i;
        for(j=i*2;j<=n;j+=i)v[j]=1;
    }
    v[nrprime+1]=1;
    sol=n;
    p=1;
    sign=-1;
    base=1;

    bkt1(1);
    g<<sol;
}