题意:
给一个n,一个长度为pow(2,n)长度的01串s;
构造一个布尔表达式f(a1,a2,…,an)
对于s的第i个值表示当i二进制表示时
每位对于aj使得表达式的值为s[i]
解法:
对于s[i]=0不用处理
对于s[i]=1输出其主析取范式即可
如果s串全为0,则输出0
AC代码:
#include<bits/stdc++.h> using namespace std; int n,siz; bool flag=0; void solve(int now){ vector<int> v; int cnt=1; for(int i=0;i<n;i++){ if(now&cnt) v.push_back(1); else v.push_back(0); cnt<<=1; } reverse(v.begin(),v.end()); if(flag){ cout<<"O "; }else{ flag=1; } /* for(int i=0;i<n;i++) cout<<v[i]<<' '; cout<<endl; */ for(int i=0;i<n;i++){ if(v[i]){ if(i) cout<<"A "; cout<<'a'<<i+1; if(now!=siz-1||i!=n-1) cout<<' '; }else{ if(i) cout<<"A "; cout<<"N a"<<i+1; if(now!=siz-1||i!=n-1) cout<<' '; } } } int main(){ cin>>n; string s; cin>>s; siz=s.length(); for(int i=0;i<siz;i++){ if(s[i]-'0') solve(i); } if(s.find('1')==-1) cout<<0<<endl; }