Cod sursa(job #3297235)

Utilizator rapidu36Victor Manz rapidu36 Data 22 mai 2025 09:27:35
Problema Mins Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <vector>

using namespace std;

vector <vector <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 d = 2; d < n; d++)
    {
        if (divizori[d].size() == 0)
        {
            for (int m = d; m < n; m += d)
            {
                if (p_dp[m] == m)
                {
                    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();
    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 *= divizori[n][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(p_dp[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;
}