We are given an integer N. We need to count the total number of such binary strings of length N such that the number of ‘0’s in the first string of length N/2 is double of the number of ‘0’s in the second string of length N/2.
Note: N is always an even positive integer.
Input : N = 4
Output : 2
Explanation: 0010 and 0001 are two binary string such that the number of zero in the first half is double the number of zero in second half.
Input : N = 6
Output : 9
Naive Approach:We can generate all the binary string of length N and then one by one can check that whether selected string follows the given scenario. But the time complexity for this approach is exponential and is O(N*2N).
Efficient Approach: This approach is based on some mathematical analysis of the problem.
Pre-requisite for this approach: Factorial and Combinatoric with modulo function.
Note: Let n = N/2.
If we perform some analysis step by step:
- The number of strings which contain two ‘0’ in first half string and one ‘0’ in second half string, is equal to nC2 * nC1.
- The number of strings which contain four ‘0’ in first half string and two ‘0’ in second half string, is equal to nC4 * nC2.
- The number of strings which contain six ‘0’ in first half string and three ‘0’ in second half string, is equal to nC6 * nC3.
We repeat above procedure till the number of ‘0’ in first half become n if n is even or (n-1) if n is odd.
So, our final answer is Σ (nC(2*i) * nCi), for 2 <= 2*i <= n.
Now, we can compute the required number of strings just by using Permutation and Combination.
int n = N/2; for(int i=2;i<=n;i=i+2) ans += ( nCr(n, i) * nCr(n, i/2);
Note : You can use Dynamic Programming technique to pre-compute CoeFunc(N, i) i.e. nCi.
Time complexity is O(N) if we pre-compute CoeFunc(N, i) in O(N*N).
# Python3 for finding number of binary strings
# number of ‘0’ in first half is double the
# number of ‘0’ in second half of string
# pre define some constant
mod = 1000000007
Max = 1001
# global values for pre computation
nCr = [[0 for _ in range(1003)]
for i in range(1003)]
for i in range(Max):
for j in range(i + 1):
if (j == 0 or j == i):
nCr[i][j] = 1
nCr[i][j] = (nCr[i – 1][j – 1] +
nCr[i – 1][j]) % mod
# function to print number of required string
n = N // 2
ans = 0
# calculate answer using proposed algorithm
for i in range(2, n + 1, 2):
ans = (ans + ((nCr[n][i] *
nCr[n][i // 2]) % mod)) % mod
# Driver code
N = 3
# This code is contributed by mohit kumar
- Count number of binary strings of length N having only 0's and 1's
- Count number of binary strings without consecutive 1's
- Count of non-overlapping sub-strings "101" and "010" in the given binary string
- Count binary strings with k times appearing adjacent two set bits
- Count numbers having N 0's and and M 1's with no leading zeros
- Count Pairs Of Consecutive Zeros
- Find all even length binary sequences with same sum of first and second half bits
- Maximum difference of zeros and ones in binary string
- Maximum consecutive one’s (or zeros) in a binary array
- Maximum difference of zeros and ones in binary string | Set 2 (O(n) time)
- Maximum consecutive one’s (or zeros) in a binary circular array
- Count of strings that become equal to one of the two strings after one removal
- Add n binary strings
- Bitwise AND of N binary strings
- Bitwise OR of N binary strings
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to email@example.com. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.