#include <iostream>
#include <vector>
std::uint16_t apply_filters(std::uint16_t init,
const std::vector<std::uint16_t>& filters,
const std::vector<bool>& mask)
{
auto res = init;
for (std::size_t i = 0; i != filters.size(); ++i) {
if (mask[i]) {
res ^= filters[i];
}
}
return res;
}
bool increase(std::vector<bool>& bs)
{
for (std::size_t i = 0; i != bs.size(); ++i) {
bs[i] = !bs[i];
if (bs[i] == true) {
return true;
}
}
return false; // overflow
}
std::size_t count_filters_combination(std::uint16_t init,
const std::vector<std::uint16_t>& filters)
{
std::vector<bool> bs(filters.size());
std::size_t count = 0;
const std::uint16_t expected = 0b1111111111;
do
{
if (expected == apply_filters(init, filters, bs)) {
++count;
}
} while (increase(bs));
return count;
}
int main()
{
std::cout << count_filters_combination(0b1111111111, {0, 0}) << std::endl;
std::cout << count_filters_combination(0b0101010101, {0b1010101010, 0b1000000000, 0b0010101010}) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKCnN0ZDo6dWludDE2X3QgYXBwbHlfZmlsdGVycyhzdGQ6OnVpbnQxNl90IGluaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVpbnQxNl90PiYgZmlsdGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+JiBtYXNrKQp7CiAgICBhdXRvIHJlcyA9IGluaXQ7CiAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpICE9IGZpbHRlcnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpZiAobWFza1tpXSkgewogICAgICAgICAgICByZXMgXj0gZmlsdGVyc1tpXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwp9Cgpib29sIGluY3JlYXNlKHN0ZDo6dmVjdG9yPGJvb2w+JiBicykKewogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSBicy5zaXplKCk7ICsraSkgewogICAgICAgIGJzW2ldID0gIWJzW2ldOwogICAgICAgIGlmIChic1tpXSA9PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsgLy8gb3ZlcmZsb3cKfQoKCnN0ZDo6c2l6ZV90IGNvdW50X2ZpbHRlcnNfY29tYmluYXRpb24oc3RkOjp1aW50MTZfdCBpbml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dWludDE2X3Q+JiBmaWx0ZXJzKQp7CiAgICBzdGQ6OnZlY3Rvcjxib29sPiBicyhmaWx0ZXJzLnNpemUoKSk7CiAgICAKICAgIHN0ZDo6c2l6ZV90IGNvdW50ID0gMDsKICAgIGNvbnN0IHN0ZDo6dWludDE2X3QgZXhwZWN0ZWQgPSAwYjExMTExMTExMTE7CiAgICBkbwogICAgewogICAgICAgIGlmIChleHBlY3RlZCA9PSBhcHBseV9maWx0ZXJzKGluaXQsIGZpbHRlcnMsIGJzKSkgewogICAgICAgICAgICArK2NvdW50OwogICAgICAgIH0KICAgIH0gd2hpbGUgKGluY3JlYXNlKGJzKSk7CiAgICByZXR1cm4gY291bnQ7Cn0KCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dCA8PCBjb3VudF9maWx0ZXJzX2NvbWJpbmF0aW9uKDBiMTExMTExMTExMSwgezAsIDB9KSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgY291bnRfZmlsdGVyc19jb21iaW5hdGlvbigwYjAxMDEwMTAxMDEsIHswYjEwMTAxMDEwMTAsIDBiMTAwMDAwMDAwMCwgMGIwMDEwMTAxMDEwfSkgPDwgc3RkOjplbmRsOwp9Cg==