Skip to content
Related Articles

Related Articles

Improve Article

Sub-string Divisibility by 3 Queries

  • Difficulty Level : Easy
  • Last Updated : 31 Mar, 2021

Given a large number, n (having number digits up to 10^6) and various queries of the form : 
Query(l, r) : find if the sub-string between the indices l and r (Both inclusive) are divisible by 3.
Examples: 
 

Input: n = 12468236544
Queries:
l=0 r=1
l=1 r=2
l=3 r=6
l=0 r=10
Output:
Divisible by 3 
Divisible by 3 
Not divisible by 3
Divisible by 3

Explanation:
In the first query, 12 is divisible by 3
In the second query, 24 is divisible by 3 and so on.

 

We know that any number is divisible by 3 if the sum of its digits is divisible by 3. Hence the idea is to pre-process an auxiliary array that would store the sum of digits. 
 

Mathematically,
sum[0] = 0
and 
for i from 0 to number of digits of number:
    sum[i+1] = sum[i]+ toInt(n[i])
where toInt(n[i]) represents the integer value 
of i'th digit of n 

Once our auxiliary array is processed, we can answer each query in O(1) time, because the substring from indices l to r would be divisible by 3 only if, (sum[r+1]-sum[l])%3 == 0
Below is a the implementation program for the same. 
 

C++




// C++ program to answer multiple queries of
// divisibility by 3 in substrings of a number
#include <iostream>
using namespace std;
 
// Array to store the sum of digits
int sum[1000005];
 
// Utility function to evaluate a character's
// integer value
int toInt(char x)
{
    return int(x) - '0';
}
 
// This function receives the string representation
// of the number and precomputes the sum array
void prepareSum(string s)
{
    sum[0] = 0;
    for (int i=0; i<s.length(); i++)
        sum[i+1] = sum[i] + toInt(s[i]);
}
 
// This function receives l and r representing
// the indices and prints the required output
void query(int l,int r)
{
    if ((sum[r+1]-sum[l])%3 == 0)
        cout << "Divisible by 3\n";
    else
        cout << "Not divisible by 3\n";
}
 
// Driver function to check the program
int main()
{
    string n = "12468236544";
 
    prepareSum(n);
    query(0, 1);
    query(1, 2);
    query(3, 6);
    query(0, 10);
    return 0;
}

Java




// Java program to answer multiple queries of
// divisibility by 3 in substrings of a number
class GFG
{
 
    // Array to store the sum of digits
    static int sum[] = new int[1000005];
 
    // Utility function to evaluate a character's
    // integer value
    static int toInt(char x)
    {
        return x - '0';
    }
 
    // This function receives the string representation
    // of the number and precomputes the sum array
    static void prepareSum(String s)
    {
        sum[0] = 0;
        for (int i = 0; i < s.length(); i++)
        {
            sum[i + 1] = sum[i] + toInt(s.charAt(i));
        }
    }
 
    // This function receives l and r representing
    // the indices and prints the required output
    static void query(int l, int r)
    {
        if ((sum[r + 1] - sum[l]) % 3 == 0)
        {
            System.out.println("Divisible by 3");
        }
        else
        {
            System.out.println("Not divisible by 3");
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String n = "12468236544";
 
        prepareSum(n);
        query(0, 1);
        query(1, 2);
        query(3, 6);
        query(0, 10);
    }
}
 
// This code has been contributed by 29AjayKumar

Python3




# Python3 program to answer multiple queries of
# divisibility by 3 in substrings of a number
 
 
# Array to store the sum of digits
sum = [0 for i in range(1000005)]
 
# Utility function to evaluate a character's
# integer value
def toInt(x):
 
    return int(x)
 
# This function receives the string representation
# of the number and precomputes the sum array
def prepareSum(s):
 
    sum[0] = 0
    for i in range(0, len(s)):
        sum[i + 1] = sum[i] + toInt(s[i])
 
# This function receives l and r representing
# the indices and prs the required output
def query(l, r):
 
    if ((sum[r + 1] - sum[l]) % 3 == 0):
        print("Divisible by 3")
    else:
        print("Not divisible by 3")
 
# Driver function to check the program
if __name__=='__main__':
     
    n = "12468236544"
    prepareSum(n)
    query(0, 1)
    query(1, 2)
    query(3, 6)
    query(0, 10)
 
# This code is contributed by
# Sanjit_Prasad

C#




// C# program to answer multiple queries of
// divisibility by 3 in substrings of a number
using System;
 
class GFG
{
 
    // Array to store the sum of digits
    static int []sum = new int[1000005];
 
    // Utility function to evaluate a character's
    // integer value
    static int toInt(char x)
    {
        return x - '0';
    }
 
    // This function receives the string representation
    // of the number and precomputes the sum array
    static void prepareSum(String s)
    {
        sum[0] = 0;
        for (int i = 0; i < s.Length; i++)
        {
            sum[i + 1] = sum[i] + toInt(s[i]);
        }
    }
 
    // This function receives l and r representing
    // the indices and prints the required output
    static void query(int l, int r)
    {
        if ((sum[r + 1] - sum[l]) % 3 == 0)
        {
            Console.WriteLine("Divisible by 3");
        }
        else
        {
            Console.WriteLine("Not divisible by 3");
        }
    }
 
    // Driver code
    public static void Main()
    {
        String n = "12468236544";
 
        prepareSum(n);
        query(0, 1);
        query(1, 2);
        query(3, 6);
        query(0, 10);
    }
}
 
/* This code contributed by PrinciRaj1992 */

Javascript




<script>
 
// JavaScript program to answer multiple queries of
// divisibility by 3 in substrings of a number
 
    // Array to store the sum of digits
    let sum = [];
   
    // Utility function to evaluate a character's
    // integer value
    function toInt(x)
    {
        return x - '0';
    }
   
    // This function receives the string representation
    // of the number and precomputes the sum array
    function prepareSum(s)
    {
        sum[0] = 0;
        for (let i = 0; i < s.length; i++)
        {
            sum[i + 1] = sum[i] + toInt(s[i]);
        }
    }
   
    // This function receives l and r representing
    // the indices and prints the required output
    function query(l, r)
    {
        if ((sum[r + 1] - sum[l]) % 3 == 0)
        {
            document.write("Divisible by 3" + "<br />");
        }
        else
        {
            document.write("Not divisible by 3" + "<br />");
        }
    }
 
// Driver Code
 
        let n = "12468236544";
   
        prepareSum(n);
        query(0, 1);
        query(1, 2);
        query(3, 6);
        query(0, 10);
                         
</script>

Output: 

Divisible by 3
Divisible by 3
Not divisible by 3
Divisible by 3

This article is contributed by Ashutosh Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.




My Personal Notes arrow_drop_up
Recommended Articles
Page :