Cod sursa(job #3297242)

Utilizator nicoleta_iancuIancu Nicoleta nicoleta_iancu Data 22 mai 2025 09:51:19
Problema Mins Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <vector>

using namespace std;

const int NDP = 7;
const int VM = 1e6;

//vector <vector <int>> divizori;
int divizori[VM][NDP];
short int nr_div[VM];
//vector <int> p_dp;
long long p_dp[VM], nr_pie[VM];

void ciur(int n)
{
    //divizori.resize(n);
    //p_dp.resize(n, 1);
    for (int i = 1; i < n; i++)
    {
        p_dp[i] = 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;
                //divizori[m].push_back(d);
                divizori[m][nr_div[m]++] = 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 ndp = nr_div[n];
    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++)
    {
        if (p_dp[i] == i)
        {
            nr_pie[i] = pie(i, c - 1);
        }
        else
        {
            nr_pie[i] = nr_pie[p_dp[i]];
        }
        nr += nr_pie[i];
    }
    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;
}