#include <bits/stdc++.h> using namespace std; #define endl '\n' vector<int> odw; vector<int> odw2; vector<int> odw3; vector<int> subset; long long modulo=1000000007; long long binpow(long long base, long long pow){ if(pow==0){ return 1; } if(pow%2==0){ long long res=binpow(base, pow/2 ); return (res*res)%modulo; } else{ return (base*binpow(base, pow-1))%modulo; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); long long n=0, r=0, r2=0, r3=0; string a,b,c; cin>>n; long long zlicz=0; cin>>r; cin>>a; cin>>r2; cin>>b; cin>>r3; cin>>c; if(r==n || r2==n || r2==n){ cout<<binpow(2,n)<<endl; return 0; } else{ for(int i=(n-1); i>=0; --i){ odw.push_back(a[i]-'0'); odw2.push_back(b[i]-'0'); odw3.push_back(c[i]-'0'); } for (int b=0; b < (1<<n); b++){ bool spr=false; long long licz=0; long long licz2=0; long long licz3=0; long long howmany=0; subset.resize(0); for (int i = 0; i < n; i++) { if ( (b&(1<<i)) ){ subset.push_back(1); } else{ subset.push_back(0); } } for(int k=0; k<n; ++k){ if(odw[k]!=subset[k]){ licz++; } } if(licz<=r){ howmany=1; spr=true; } if(spr==false){ for(int k=0; k<n; ++k){ if(odw2[k]!=subset[k]){ licz2++; } } if(licz2<=r2){ howmany=1; spr=true; } } if(spr==false){ for(int k=0; k<n; ++k){ if(odw3[k]!=subset[k]){ licz3++; } } if(licz3<=r3){ howmany=1; } } zlicz+=howmany; zlicz%=modulo; } cout<<zlicz<<endl; 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 | #include <bits/stdc++.h> using namespace std; #define endl '\n' vector<int> odw; vector<int> odw2; vector<int> odw3; vector<int> subset; long long modulo=1000000007; long long binpow(long long base, long long pow){ if(pow==0){ return 1; } if(pow%2==0){ long long res=binpow(base, pow/2 ); return (res*res)%modulo; } else{ return (base*binpow(base, pow-1))%modulo; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); long long n=0, r=0, r2=0, r3=0; string a,b,c; cin>>n; long long zlicz=0; cin>>r; cin>>a; cin>>r2; cin>>b; cin>>r3; cin>>c; if(r==n || r2==n || r2==n){ cout<<binpow(2,n)<<endl; return 0; } else{ for(int i=(n-1); i>=0; --i){ odw.push_back(a[i]-'0'); odw2.push_back(b[i]-'0'); odw3.push_back(c[i]-'0'); } for (int b=0; b < (1<<n); b++){ bool spr=false; long long licz=0; long long licz2=0; long long licz3=0; long long howmany=0; subset.resize(0); for (int i = 0; i < n; i++) { if ( (b&(1<<i)) ){ subset.push_back(1); } else{ subset.push_back(0); } } for(int k=0; k<n; ++k){ if(odw[k]!=subset[k]){ licz++; } } if(licz<=r){ howmany=1; spr=true; } if(spr==false){ for(int k=0; k<n; ++k){ if(odw2[k]!=subset[k]){ licz2++; } } if(licz2<=r2){ howmany=1; spr=true; } } if(spr==false){ for(int k=0; k<n; ++k){ if(odw3[k]!=subset[k]){ licz3++; } } if(licz3<=r3){ howmany=1; } } zlicz+=howmany; zlicz%=modulo; } cout<<zlicz<<endl; return 0; } } |