#include #include #include #include using namespace std; int main() { ifstream fin("note2.in"); ofstream fout("note2.out"); if (!fin) { cerr << "Грешка при отваряне на файла note2.in" << endl; return 1; } int n; long long M; fin >> n >> M; vector arr(n); for (int i = 0; i < n; i++) { fin >> arr[i]; } // Ако M == 0, всички подмасиви (при неотрицателни числа) удовлетворяват условието. long long total_subarrays = static_cast(n) * (n + 1) / 2; if (M == 0) { fout << total_subarrays << "\n"; return 0; } long long result = 0; // dp ще съдържа двойки (текущ_and, брой подмасиви), // за всички подмасиви, завършващи на позиция i-1. vector> dp; for (int i = 0; i < n; i++) { // new_dp ще съдържа резултатите за подмасивите, завършващи на i. vector> new_dp; // Започваме нов подмасив, започващ от позиция i. new_dp.push_back({ arr[i], 1 }); // За всеки подмасив, завършващ на i-1, разширяваме го с arr[i]. for (auto& p : dp) { long long new_and = p.first & arr[i]; // Ако вече имаме същата стойност, увеличаваме броя. if (!new_dp.empty() && new_dp.back().first == new_and) new_dp.back().second += p.second; else new_dp.push_back({ new_and, p.second }); } dp = move(new_dp); // Добавяме броя на подмасивите, завършващи на i, които удовлетворяват условието. for (auto& p : dp) { if (p.first >= M) result += p.second; } } fout << result << "\n"; return 0; }