# Sub-string Divisibility by 3 Queries

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.
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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
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 ` `using` `namespace` `std; ` ` `  `// Array to store the sum of digits ` `int` `sum; ` ` `  `// 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; ` `    ``for` `(``int` `i=0; i

## 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``; ` ` `  `    ``// 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; ` `        ``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 */`

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.

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.