include <iostream>
#include <string>
#include <vector>
using namespace std;
void printBinaryToDecimal(const std::string& binStr) {
int decimal = 0;
for (char c : binStr) {
if (c == '0' || c == '1') {
decimal = (decimal << 1) + (c - '0');
}
}
std::cout << decimal << "\n"<<endl;
}
void printOneSets(int n, const string& vec) {
size_t required_length = 1ULL << n;
if (vec.length() != required_length) {
cout << "Error! Invalid vector!\n";
return;
}
for (size_t i = 0; i < vec.length(); ++i) {
if (vec[i] != '0' && vec[i] != '1') {
cout << "Error! Invalid vector!\n";
return;
}
if (vec[i] == '1') {
string binary_set = "";
for (int bit = n - 1; bit >= 0; --bit) {
binary_set += ((i >> bit) & 1) ? '1' : '0';
}
cout << binary_set << "\n";
}
}
cout << "\n";
}
void analyzeVariables(int n, const string& vec) {
size_t required_length = 1ULL << n;
if (vec.length() != required_length) {
cout << "Error! Invalid vector!\n";
return;
}
for (char c : vec) {
if (c != '0' && c != '1') {
cout << "Error! Invalid vector!\n";
return;
}
}
vector<int> essential;
vector<int> dummy;
for (int i = 1; i <= n; ++i) {
int bit_pos = n - i;
bool is_essential = false;
for (size_t j = 0; j < required_length; ++j) {
if (((j >> bit_pos) & 1) == 0) {
size_t paired_j = j | (1ULL << bit_pos);
if (vec[j] != vec[paired_j]) {
is_essential = true;
break;
}
}
}
if (is_essential) {
essential.push_back(i);
}
else {
dummy.push_back(i);
}
}
cout << "Essential variables: ";
if (essential.empty()) {
cout << "None";
}
else {
for (size_t i = 0; i < essential.size(); ++i) {
cout << "x" << essential[i] << (i + 1 < essential.size() ? ", " : "");
}
}
cout << "\n";
cout << "Dummy variables : ";
if (dummy.empty()) {
cout << "None";
}
else {
for (size_t i = 0; i < dummy.size(); ++i) {
cout << "x" << dummy[i] << (i + 1 < dummy.size() ? ", " : "");
}
}
cout << "\n";
}
int main() {
int n;
if (!(cin >> n) || n < 1 || n > 5) {
cout << "Error! Invalid vector!\n";
return 0;
}
string vector_str;
if (!(cin >> vector_str)) {
cout << "Error! Invalid vector!\n";
return 0;
}
printBinaryToDecimal(vector_str);
printOneSets(n, vector_str);
analyzeVariables(n, vector_str);
return 0;
}