Skip to content
Related Articles

Related Articles

Number of ways to split a binary number such that every part is divisible by 2

View Discussion
Improve Article
Save Article
  • Last Updated : 04 Aug, 2021
View Discussion
Improve Article
Save Article

Given a binary string S, the task is to find the number of ways to split it into parts such that every part is divisible by 2.

Examples: 

Input: S = “100” 
Output:
There are two ways to split the string: 
{“10”, “0”} and {“100”}
Input: S = “110” 
Output:

Approach: One observation is that the string can only be split after a 0. Thus, count the number of zeros in the string. Let’s call this count c_zero. Assuming the case when the string is even, for every 0 except for the rightmost one, there are two choices i.e. either cut the string after that zero or don’t. Thus, the final answer becomes 2(c_zero – 1) for even strings. 
The case, where the string can’t be split is the case when it ends at a 1. Thus, for odd strings answer will always be zero as the last split part will always be odd.

Below is the implementation of the above approach: 

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
#define maxN 20
#define maxM 64
 
// Function to return the required count
int cntSplits(string s)
{
    // If the splitting is not possible
    if (s[s.size() - 1] == '1')
        return 0;
 
    // To store the count of zeroes
    int c_zero = 0;
 
    // Counting the number of zeroes
    for (int i = 0; i < s.size(); i++)
        c_zero += (s[i] == '0');
 
    // Return the final answer
    return (int)pow(2, c_zero - 1);
}
 
// Driver code
int main()
{
    string s = "10010";
 
    cout << cntSplits(s);
 
    return 0;
}

Java




// Java implementation of the approach
class GFG
{
 
static int maxN = 20;
static int maxM = 64;
 
// Function to return the required count
static int cntSplits(String s)
{
    // If the splitting is not possible
    if (s.charAt(s.length() - 1) == '1')
        return 0;
 
    // To store the count of zeroes
    int c_zero = 0;
 
    // Counting the number of zeroes
    for (int i = 0; i < s.length(); i++)
        c_zero += (s.charAt(i) == '0') ? 1 : 0;
 
    // Return the final answer
    return (int)Math.pow(2, c_zero - 1);
}
 
// Driver code
public static void main(String []args)
{
    String s = "10010";
 
    System.out.println(cntSplits(s));
}
}
 
// This code is contributed by PrinciRaj1992

Python3




# Python3 implementation of the approach
 
# Function to return the required count
def cntSplits(s) :
 
    # If the splitting is not possible
    if (s[len(s) - 1] == '1') :
        return 0;
 
    # To store the count of zeroes
    c_zero = 0;
 
    # Counting the number of zeroes
    for i in range(len(s)) :
        c_zero += (s[i] == '0');
 
    # Return the final answer
    return int(pow(2, c_zero - 1));
 
# Driver code
if __name__ == "__main__" :
 
    s = "10010";
 
    print(cntSplits(s));
     
# This code is contributed by AnkitRai01

C#




// C# implementation of the approach
using System;
                     
class GFG
{
 
static int maxN = 20;
static int maxM = 64;
 
// Function to return the required count
static int cntSplits(String s)
{
    // If the splitting is not possible
    if (s[s.Length - 1] == '1')
        return 0;
 
    // To store the count of zeroes
    int c_zero = 0;
 
    // Counting the number of zeroes
    for (int i = 0; i < s.Length; i++)
        c_zero += (s[i] == '0') ? 1 : 0;
 
    // Return the final answer
    return (int)Math.Pow(2, c_zero - 1);
}
 
// Driver code
public static void Main(String []args)
{
    String s = "10010";
 
    Console.WriteLine(cntSplits(s));
}
}
 
// This code is contributed by 29AjayKumar

Javascript




<script>
 
// Javascript implementation of the approach
 
var maxN = 20;
var maxM = 64;
 
// Function to return the required count
function cntSplits(s)
{
    // If the splitting is not possible
    if (s[s.length - 1] == '1')
        return 0;
 
    // To store the count of zeroes
    var c_zero = 0;
 
    // Counting the number of zeroes
    for (var i = 0; i < s.length; i++)
        c_zero += (s[i] == '0');
 
    // Return the final answer
    return Math.pow(2, c_zero - 1);
}
 
// Driver code
var s = "10010";
document.write( cntSplits(s));
 
</script>

Output: 

4

 

Time Complexity: O(N)
Auxiliary Space: O(1)


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!