華東202011月賽補題
阿新 • • 發佈:2020-12-07
題意:
給一個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; }