给定一个大数n(数字位数最多为10 ^ 6)和各种形式的查询:
Query(l,r):查找索引l和r(包括两端)之间的子字符串是否可被3整除。
例子:
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.
我们知道,如果数字的总和可以被3整除,那么任何数字都可以被3整除。因此,我们的想法是对存储数字和的辅助数组进行预处理。
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
一旦处理完辅助数组,我们就可以在O(1)时间内回答每个查询,因为只有当(sum [r + 1] -sum [l])%3时,索引l到r的子字符串才能被3整除。 == 0
下面是一个相同的实现程序。
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[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
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
输出:
Divisible by 3
Divisible by 3
Not divisible by 3
Divisible by 3