Cod sursa(job #3250379)

Utilizator monica_LMonica monica_L Data 20 octombrie 2024 15:24:41
Problema Mins Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#define NMAX 1000001

using namespace std;

ifstream f("mins.in");
ofstream g("mins.out");
long long c,d,mn,mx,rez,i,j,k,fact,p,x,m,s,nrc,nrp,v[NMAX],prim[NMAX];
bool ciur[NMAX];

int main()
{

    f>>c>>d;
    c--; d--;
    mn=min(c,d); mx=max(c,d);
  // ciurul lui Eratostene
    for(i=2;i<=mn;i++)
      if(ciur[i]==0)
        {
           prim[++nrp]=i;
           for(int j = i + i; j < NMAX; j += i)
                ciur[j] = 1;
        }

    rez=mx; // toate numerele sunt prime cu 1

    for(k=2;k<=mn;k++)
    {
        // se construieste vectorul cu factorii primi ai lui k (v cu m elem)
        x=k;
        m=0;
        i=1;
        while (x>1)
        {
            if(x%prim[i]==0) v[++m]=prim[i];
            while(x%prim[i]==0) x=x/prim[i];
            i++;
            if(prim[i]*prim[i]>x) fact=x;
        }

        s=mx; // s=nr. de numere prime cu i care sunt <= mx (scad din mx numerele neprime cu i)

        for(i=1; i < (1LL << m); i++)
        {
            nrc = 0; // numarul de elemente din submultimea curenta
            p = 1; // produsul elementelor din submultimea curenta
            for(j = 0;j < m; j++)
              if(i & (1LL << j))
                {
                    nrc++;
                    p = p * v[j + 1];
                }

            if(nrc % 2 == 1) s = s - mx / p;
            else s = s + mx / p;

        }
        rez+=s;
    }

    g<<rez<<'\n';

    return 0;
}