Editorial for No divisibles
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Nota : La cantidad de números desde hasta que son divididos por es .
Nota : El principio de inclusión y exclusión afirma que,
Definamos, (o sea, que es el conjunto de los números desde hasta que no son divididos por ). Utilizando la nota podemos calcular como . Por comodidad, en lo adelante llamaré a como
Para resolver el problema debemos calcular , lo cual puede ser hecho utilizando la nota (el principio de inclusión y exclusión),
Para calcular lo anterior, necesitamos calcular la intersección entre dos conjuntos, en este problema: . De esta forma,
Código de ejemplo 1:
int n; cin >> n;
auto f = [&](int d) { // f(d) = |A_d|
return n - n / d;
};
int res = f(2) + f(3) + f(5) - f(6) - f(10) - f(15) + f(30);
cout << res << endl;
Código de ejemplo 2 (con máscara de bits): donde
int n; cin >> n;
auto f = [&](int d) { // f(d) = |A_d|
return n - n / d;
};
vector<int> nums = {2, 3, 5};
int res = 0;
for (int mask = 1; mask < (1 << 3); mask++) {
int prod = 1, parity = 0;
for (int i = 0; i < 3; i++) {
if ((mask >> i) & 1) {
prod *= nums[i];
parity = (parity + 1) % 2;
}
}
if (parity == 0) {
res -= f(prod);
} else {
res += f(prod);
}
}
cout << res << endl;
Otro problema que puede ser resuelto usando el principio de inclusión y exclusión:
Comments