#include<iostream> #include<string> //#include<stdio.h> using namespace std; long long n,r1,r2,r3,odp; long long roznica_1_2,roznica_2_3,roznica_1_3; long long Pole[4]; long long n_po_[10101]; string bits1,bits2,bits3; const long long P=1000000007; long long Roznica(string a,string b, long long dl) { long long iter; long long wynik=0; for(iter=0;iter<dl;iter++) { if (a[iter]!=b[iter]) { wynik++; } } return wynik; } long long Wspolne(long long r_a,long long r_b,long long k) { ///k to roznica miedzy kulami a i b; long long k_po_[10101]; long long n_bez_k_po_[10101]; long long Czesc_Wspolna=0; k_po_[0]=1; //printf(("k=%lli\n",k); for (long long i=1;i<=k;i++) { k_po_[i]=(k_po_[i-1]*(k-i+1)/i)%P; //printf(("k_po_[%lli]=%lli\n",i,k_po_[i]); } n_bez_k_po_[0]=1; for (long long i=1;i<=n-k;i++) { n_bez_k_po_[i]=(n_bez_k_po_[i-1]*(n-k-i+1)/i)%P; } for (long long i=1;i<=n-k;i++) { n_bez_k_po_[i]=(n_bez_k_po_[i-1]+n_bez_k_po_[i])%P; //printf(("n_bez_k_po_[%lli]=%lli\n",i,n_bez_k_po_[i]); } for (int x=r_a; x>=k-r_b;x--) { Czesc_Wspolna=(Czesc_Wspolna+(k_po_[x]*n_bez_k_po_[min(r_a-x,r_b-k+x)]%P))%P; } //printf(("Czesc_Wspolna(a,b)=%lli\n",Czesc_Wspolna); return Czesc_Wspolna; } void Wypisz() { while (odp<0) { odp+=P; } odp=odp%P; cout<<odp<<'\n'; return ; } int main () { ios::sync_with_stdio(false); cin>>n; cin>>r1>>bits1; cin>>r2>>bits2; cin>>r3>>bits3; roznica_1_2=Roznica(bits1,bits2,n); roznica_2_3=Roznica(bits2,bits3,n); roznica_1_3=Roznica(bits1,bits3,n); n_po_[0]=1; for (int i=1;i<=n;i++) { n_po_[i]=((n_po_[i-1])*(n-i+1)/i)%P; } for (int i=1;i<=n;i++) { n_po_[i]=((n_po_[i-1])+n_po_[i])%P; } Pole[1]=n_po_[r1]; Pole[2]=n_po_[r2]; Pole[3]=n_po_[r3]; //printf(("Pole1=%lli Pole2=%lli Pole3=%lli\n",Pole[1],Pole[2],Pole[3]); if(r1+r2<roznica_1_2) { ///rozlaczne 1 i 2; //printf(("rozlaczne 1 i 2"); odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r3,roznica_1_3)-Wspolne(r2,r3,roznica_2_3); Wypisz(); return 0; } if(r1+r3<roznica_1_3) { ///rozlaczne 1 i 3; //printf(("rozlaczne 1 i 3"); odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r2,roznica_1_2)-Wspolne(r2,r3,roznica_2_3); Wypisz(); return 0; } if(r2+r3<roznica_2_3) { ///rozlaczne 2 i 3; //printf(("rozlaczne 2 i 3"); odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r2,roznica_1_2)-Wspolne(r1,r3,roznica_1_3); Wypisz(); return 0; } if (r1>=roznica_1_2+r2 || r3>=roznica_2_3+r2) { /// kula 1 lub 3 zawiera kule dwa //printf(("zawarta kula 2"); odp=Pole[1]+Pole[3]-Wspolne(r1,r3,roznica_1_3); Wypisz(); return 0; } if (r1>=roznica_1_3+r3 || r2>=roznica_2_3+r3) { /// kula 1 lub 2 zawiera kule 3 //printf(("zawarta kula 3"); odp=Pole[1]+Pole[2]-Wspolne(r1,r2,roznica_1_2); Wypisz(); return 0; } if (r2>=roznica_1_2+r1 || r3>=roznica_1_3+r1) { /// kula 2 lub 3 zawiera kule 1 //printf(("zawarta kula 1"); odp=Pole[2]+Pole[3]-Wspolne(r2,r3,roznica_2_3); Wypisz(); return 0; } odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r2,roznica_1_2)-Wspolne(r2,r3,roznica_2_3)-Wspolne(r1,r3,roznica_1_3); Wypisz(); 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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #include<iostream> #include<string> //#include<stdio.h> using namespace std; long long n,r1,r2,r3,odp; long long roznica_1_2,roznica_2_3,roznica_1_3; long long Pole[4]; long long n_po_[10101]; string bits1,bits2,bits3; const long long P=1000000007; long long Roznica(string a,string b, long long dl) { long long iter; long long wynik=0; for(iter=0;iter<dl;iter++) { if (a[iter]!=b[iter]) { wynik++; } } return wynik; } long long Wspolne(long long r_a,long long r_b,long long k) { ///k to roznica miedzy kulami a i b; long long k_po_[10101]; long long n_bez_k_po_[10101]; long long Czesc_Wspolna=0; k_po_[0]=1; //printf(("k=%lli\n",k); for (long long i=1;i<=k;i++) { k_po_[i]=(k_po_[i-1]*(k-i+1)/i)%P; //printf(("k_po_[%lli]=%lli\n",i,k_po_[i]); } n_bez_k_po_[0]=1; for (long long i=1;i<=n-k;i++) { n_bez_k_po_[i]=(n_bez_k_po_[i-1]*(n-k-i+1)/i)%P; } for (long long i=1;i<=n-k;i++) { n_bez_k_po_[i]=(n_bez_k_po_[i-1]+n_bez_k_po_[i])%P; //printf(("n_bez_k_po_[%lli]=%lli\n",i,n_bez_k_po_[i]); } for (int x=r_a; x>=k-r_b;x--) { Czesc_Wspolna=(Czesc_Wspolna+(k_po_[x]*n_bez_k_po_[min(r_a-x,r_b-k+x)]%P))%P; } //printf(("Czesc_Wspolna(a,b)=%lli\n",Czesc_Wspolna); return Czesc_Wspolna; } void Wypisz() { while (odp<0) { odp+=P; } odp=odp%P; cout<<odp<<'\n'; return ; } int main () { ios::sync_with_stdio(false); cin>>n; cin>>r1>>bits1; cin>>r2>>bits2; cin>>r3>>bits3; roznica_1_2=Roznica(bits1,bits2,n); roznica_2_3=Roznica(bits2,bits3,n); roznica_1_3=Roznica(bits1,bits3,n); n_po_[0]=1; for (int i=1;i<=n;i++) { n_po_[i]=((n_po_[i-1])*(n-i+1)/i)%P; } for (int i=1;i<=n;i++) { n_po_[i]=((n_po_[i-1])+n_po_[i])%P; } Pole[1]=n_po_[r1]; Pole[2]=n_po_[r2]; Pole[3]=n_po_[r3]; //printf(("Pole1=%lli Pole2=%lli Pole3=%lli\n",Pole[1],Pole[2],Pole[3]); if(r1+r2<roznica_1_2) { ///rozlaczne 1 i 2; //printf(("rozlaczne 1 i 2"); odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r3,roznica_1_3)-Wspolne(r2,r3,roznica_2_3); Wypisz(); return 0; } if(r1+r3<roznica_1_3) { ///rozlaczne 1 i 3; //printf(("rozlaczne 1 i 3"); odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r2,roznica_1_2)-Wspolne(r2,r3,roznica_2_3); Wypisz(); return 0; } if(r2+r3<roznica_2_3) { ///rozlaczne 2 i 3; //printf(("rozlaczne 2 i 3"); odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r2,roznica_1_2)-Wspolne(r1,r3,roznica_1_3); Wypisz(); return 0; } if (r1>=roznica_1_2+r2 || r3>=roznica_2_3+r2) { /// kula 1 lub 3 zawiera kule dwa //printf(("zawarta kula 2"); odp=Pole[1]+Pole[3]-Wspolne(r1,r3,roznica_1_3); Wypisz(); return 0; } if (r1>=roznica_1_3+r3 || r2>=roznica_2_3+r3) { /// kula 1 lub 2 zawiera kule 3 //printf(("zawarta kula 3"); odp=Pole[1]+Pole[2]-Wspolne(r1,r2,roznica_1_2); Wypisz(); return 0; } if (r2>=roznica_1_2+r1 || r3>=roznica_1_3+r1) { /// kula 2 lub 3 zawiera kule 1 //printf(("zawarta kula 1"); odp=Pole[2]+Pole[3]-Wspolne(r2,r3,roznica_2_3); Wypisz(); return 0; } odp=Pole[1]+Pole[2]+Pole[3]-Wspolne(r1,r2,roznica_1_2)-Wspolne(r2,r3,roznica_2_3)-Wspolne(r1,r3,roznica_1_3); Wypisz(); return 0; } |