Cod sursa(job #2581231)

Utilizator Rares31100Popa Rares Rares31100 Data 14 martie 2020 18:28:28
Problema Fractii Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <bits/stdc++.h>
#define ULL unsigned long long

using namespace std;

ifstream in("fractii.in");
ofstream out("fractii.out");

int n;
int vf[3000001],urm[3000001],last[1000001],nrG;
int Div[20];
bitset <1000001> viz;
ULL sum;

void adauga(int nr,int val)
{
    vf[++nrG]=val;
    urm[nrG]=last[nr];
    last[nr]=nrG;
}

void Ciur()
{
    for(int i=2;i<=n;i++)
        if(!viz[i])
        {
            adauga(i,i);

            for(int j=2*i;j<=n;j+=i)
            {
                viz[j]=1;
                adauga(j,i);
            }
        }
}

int main()
{
    in>>n;
    Ciur();

    sum+=(ULL)n*n;
    for(int i=2,val=0;i<=n;i++,val=0)
    {
        for(int k=last[i];k;k=urm[k])
            Div[val++]=vf[k];

        for(int j=1,nrD=0,Z=1;j<(1<<val);j++,nrD=0,Z=1)
        {
            for(int k=0;k<val;k++)
                if(j&(1<<k))
                {
                    nrD++;
                    Z*=Div[k];
                }

            sum+=(nrD%2?-n/Z:n/Z);
        }

    }

    out<<sum;

    return 0;
}