Pagini recente » Cod sursa (job #3297224) | Cod sursa (job #3297223) | Cod sursa (job #2550795) | Cod sursa (job #3297235)
#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;
}