#include<iostream>
#include<vector>
#include<string>
const int MAX = 2000000;
using namespace std;
bool wyst[2000000];
vector<int>literaly;
vector<int>tab[100000];
string s,s1,sn;
vector<int>rozklad;
int wartosc[2000000];
void rozl(int x){
    while(x){
        if(x%2==1)
            rozklad.push_back(1);
        else
            rozklad.push_back(0);
        x/=2;
    }
}
bool oblicz(int x){
    int jwp;
    for(int i=1;i<=x;i++){
        jwp=0;
        for(int j=0;j<tab[i].size();j++){
            if(tab[i][j] >MAX){
                jwp= wartosc[tab[i][j]-MAX] xor 1;
            }
            else
                jwp=wartosc[tab[i][j]];
            if(jwp==1)
                break;
        }
        if(jwp != 1)
            break;
    }
    if(jwp==1)
        return true;
    return false;
}
int main(){
    cin.sync_with_stdio(false);
    int n,t,wyn,m,q=0,d;
    char c;
    getline(cin,sn,'\n');
    getline(cin,s1,'\n');
    bool spr=false;
    for(int i=0;i<s1.size();i++){
        c=s1[i];
        if(c=='('){
            spr=true;
            q++;
            continue;
        }
        if(spr){
            if(c!='v'&&c!=')'&&c!=' ')
                s+=c;
            else if (s.size()!=0){
                t=1;
                wyn=0;
                m=0;
                for(int i=s.size()-1;i>=0;i--){
                    if(s[i]=='x'){
                        if(i!=0)
                            m=MAX;
                        break;
                    }
                    else{
                        wyn+=(s[i]-48)*t;
                        t*=10;
                    }
                }
                if(!wyst[wyn]){
                    wyst[wyn]=true;
                    literaly.push_back(wyn);
                }
                tab[q].push_back(wyn+m);
                s.clear();
            }
        }
        if(c==')')
            spr=false;
    }
    n=literaly.size();
    d=1<<n;
    int odp=0;
    for(int i=0;i<d;i++){
        for(int j=1;j<=n;j++)
            wartosc[j]=0;
        rozklad.clear();
        rozl(i);
        for(int j=0;j<rozklad.size();j++)
            wartosc[j+1]=rozklad[j];
        if(oblicz(q)){
            odp++;
        }
    }
    cout << odp;
    return 0;
}
        | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include<iostream> #include<vector> #include<string> const int MAX = 2000000; using namespace std; bool wyst[2000000]; vector<int>literaly; vector<int>tab[100000]; string s,s1,sn; vector<int>rozklad; int wartosc[2000000]; void rozl(int x){ while(x){ if(x%2==1) rozklad.push_back(1); else rozklad.push_back(0); x/=2; } } bool oblicz(int x){ int jwp; for(int i=1;i<=x;i++){ jwp=0; for(int j=0;j<tab[i].size();j++){ if(tab[i][j] >MAX){ jwp= wartosc[tab[i][j]-MAX] xor 1; } else jwp=wartosc[tab[i][j]]; if(jwp==1) break; } if(jwp != 1) break; } if(jwp==1) return true; return false; } int main(){ cin.sync_with_stdio(false); int n,t,wyn,m,q=0,d; char c; getline(cin,sn,'\n'); getline(cin,s1,'\n'); bool spr=false; for(int i=0;i<s1.size();i++){ c=s1[i]; if(c=='('){ spr=true; q++; continue; } if(spr){ if(c!='v'&&c!=')'&&c!=' ') s+=c; else if (s.size()!=0){ t=1; wyn=0; m=0; for(int i=s.size()-1;i>=0;i--){ if(s[i]=='x'){ if(i!=0) m=MAX; break; } else{ wyn+=(s[i]-48)*t; t*=10; } } if(!wyst[wyn]){ wyst[wyn]=true; literaly.push_back(wyn); } tab[q].push_back(wyn+m); s.clear(); } } if(c==')') spr=false; } n=literaly.size(); d=1<<n; int odp=0; for(int i=0;i<d;i++){ for(int j=1;j<=n;j++) wartosc[j]=0; rozklad.clear(); rozl(i); for(int j=0;j<rozklad.size();j++) wartosc[j+1]=rozklad[j]; if(oblicz(q)){ odp++; } } cout << odp; return 0; } | 
 
            
         English
                    English