#include <bits/stdc++.h>
#define QCK ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define debug(x) cerr<<#x<<" "<<x<<endl
#define LL long long
using namespace std;
const int mod = 1e9+7;
int Newt[10010][10010];
int r1, r2, r3, wsp, roz, n, len, a, b, op, res;
string s1, s2, s3;
int sphere(int r){
int ret = 0;
for(int i=0;i<=r;i++){
ret+=Newt[n][i];
ret%=mod;
}
return ret;
}
int main(){
QCK;
cin>>n;
cin>>r1>>s1>>r2>>s2>>r3>>s3;
if(r1==r2&&s1==s2){
swap(r2,r3);
swap(s2,s3);
}
if(r1>r2){
swap(r1,r2);
swap(s1,s2);
}
bitset <10010> A, B;
for(int i=0;i<s1.size();i++){
if(s1[i]=='1')
A[i]=1;
if(s2[i]=='1')
B[i]=1;
}
A^=B;
roz=A.count();
wsp=n-A.count();
len=r1+r2-roz;
Newt[0][0]=1;
for(int i=1;i<=10000;i++){
Newt[i][0]=1;
for(int j=1;j<=i;j++){
Newt[i][j]=(Newt[i-1][j]+Newt[i-1][j-1])%mod;
}
}
res=(sphere(r1)+sphere(r2))%mod;
if(roz<=(abs(r1-r2)))
res=sphere(r2);
else if(roz>r1+r2);
else{
for(int i=r1-len;i<=r1;i++){
if(i>roz)
op=roz-i;
else
op=i;
if(op>=0)
a=roz;
else
a=wsp;
b=abs(i);
res-=Newt[a][b];
if(res<0)
res+=mod;
}
}
cout<<res<<endl;
}
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 | #include <bits/stdc++.h> #define QCK ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define debug(x) cerr<<#x<<" "<<x<<endl #define LL long long using namespace std; const int mod = 1e9+7; int Newt[10010][10010]; int r1, r2, r3, wsp, roz, n, len, a, b, op, res; string s1, s2, s3; int sphere(int r){ int ret = 0; for(int i=0;i<=r;i++){ ret+=Newt[n][i]; ret%=mod; } return ret; } int main(){ QCK; cin>>n; cin>>r1>>s1>>r2>>s2>>r3>>s3; if(r1==r2&&s1==s2){ swap(r2,r3); swap(s2,s3); } if(r1>r2){ swap(r1,r2); swap(s1,s2); } bitset <10010> A, B; for(int i=0;i<s1.size();i++){ if(s1[i]=='1') A[i]=1; if(s2[i]=='1') B[i]=1; } A^=B; roz=A.count(); wsp=n-A.count(); len=r1+r2-roz; Newt[0][0]=1; for(int i=1;i<=10000;i++){ Newt[i][0]=1; for(int j=1;j<=i;j++){ Newt[i][j]=(Newt[i-1][j]+Newt[i-1][j-1])%mod; } } res=(sphere(r1)+sphere(r2))%mod; if(roz<=(abs(r1-r2))) res=sphere(r2); else if(roz>r1+r2); else{ for(int i=r1-len;i<=r1;i++){ if(i>roz) op=roz-i; else op=i; if(op>=0) a=roz; else a=wsp; b=abs(i); res-=Newt[a][b]; if(res<0) res+=mod; } } cout<<res<<endl; } |
English