Cod sursa(job #3297232)

Utilizator rapidu36Victor Manz rapidu36 Data 22 mai 2025 09:15:33
Problema Mins Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>

using namespace std;

vector <vector <short int>> divizori;
vector <int> p_dp;

void ciur(int n)
{
    divizori.resize(n);
    p_dp.resize(n, 1);
    for (int d = 2; d < n; d++)
    {
        if (p_dp[d] == 1)
        {
            for (int m = d; m < n; m += d)
            {
                p_dp[m] *= d;
            }
            for (int m = d * d; m < n; m += d)
            {
                divizori[m].push_back(d);
            }
        }
    }
}

int pie(int n, int x)
{
    ///numarul de numere prime cu n mai mici sau egale cu x
    int ndp = (int)divizori[n].size(), prod = 1;
    vector <int> divi(ndp);
    for (auto d: divizori[n])
    {
        prod *= d;
    }
    for (int i = 0; i < ndp; i++)
    {
        divi[i] = divizori[n][i];
    }
    if (prod != p_dp[n])
    {
        ndp++;
        divi.push_back(p_dp[n] / prod);
    }

    int suma = 0;
    for (int m = 0; m < (1 << ndp); m++)
    {
        int prod = 1;
        bool adun = true;
        for (int i = 0; i < ndp; i++)
        {
            if (m & (1 << i))
            {
                prod *= divi[i];
                adun = (!adun);
            }
        }
        if (adun)
        {
            suma += x / prod;
        }
        else
        {
            suma -= x / prod;
        }
    }
    return suma;
}

long long nr_puncte(int c, int d)
{
    ciur(d);
    long long nr = 0;
    for (int i = 1; i < d; i++)
    {
        nr += pie(i, c - 1);
    }
    return nr;
}

int main()
{
    ifstream in("mins.in");
    ofstream out("mins.out");
    int c, d;
    in >> c >> d;
    out << nr_puncte(c, d) << "\n";
    in.close();
    out.close();
    return 0;
}