给定一个大数n(数字位数最多为10 ^ 6)和以下形式的各种查询:
Query(l, r) : find if the sub-string between the
indices l and r (Both inclusive)
are divisible by 11.
例子:
Input: n = 122164154695
Queries: l = 0 r = 3, l = 1 r = 2, l = 5 r = 9,
l = 0 r = 11
Output:
True
False
False
True
Explanation:
In the first query, 1221 is divisible by 11
In the second query, 22 is divisible by 11 and so on.
我们知道,如果奇数位索引的总和与偶数位索引的总和之间的差可以被11整除,则任何数字都可以被11整除,即,
总和(奇数位的数字)–总和(偶数位的数字)应被11整除。
因此,该想法是预处理一个辅助数组,该数组将在奇数和偶数位置存储数字总和。
为了评估查询,我们可以使用辅助数组在O(1)中回答它。
C++
// C++ program to check divisibility by 11 in
// substrings of a number string
#include
using namespace std;
const int MAX = 1000005;
// To store sums of even and odd digits
struct OddEvenSums
{
// Sum of even placed digits
int e_sum;
// Sum of odd placed digits
int o_sum;
};
// Auxiliary array
OddEvenSums sum[MAX];
// Utility function to evaluate a character's
// integer value
int toInt(char x)
{
return int(x) - 48;
}
// This function receives the string representation
// of the number and precomputes the sum array
void preCompute(string x)
{
// Initialize everb
sum[0].e_sum = sum[0].o_sum = 0;
// Add the respective digits depending on whether
// they're even indexed or odd indexed
for (int i=0; i
Java
// Java program to check divisibility by 11 in
// subStrings of a number String
class GFG
{
static int MAX = 1000005;
// To store sums of even and odd digits
static class OddEvenSums
{
// Sum of even placed digits
int e_sum;
// Sum of odd placed digits
int o_sum;
};
// Auxiliary array
static OddEvenSums []sum = new OddEvenSums[MAX];
// Utility function to evaluate a character's
// integer value
static int toInt(char x)
{
return x - 48;
}
// This function receives the String representation
// of the number and precomputes the sum array
static void preCompute(String x)
{
// Initialize everb
sum[0].e_sum = sum[0].o_sum = 0;
// Add the respective digits depending on whether
// they're even indexed or odd indexed
for (int i = 0; i < x.length(); i++)
{
if (i % 2 == 0)
{
sum[i + 1].e_sum = sum[i].e_sum + toInt(x.charAt(i));
sum[i + 1].o_sum = sum[i].o_sum;
}
else
{
sum[i + 1].o_sum = sum[i].o_sum + toInt(x.charAt(i));
sum[i + 1].e_sum = sum[i].e_sum;
}
}
}
// This function receives l and r representing
// the indices and prints the required output
static boolean query(int l, int r)
{
int diff = (sum[r + 1].e_sum - sum[r + 1].o_sum) -
(sum[l].e_sum - sum[l].o_sum);
return (diff % 11 == 0);
}
//driver function to check the program
public static void main(String[] args)
{
for (int i = 0; i < MAX; i++) {
sum[i] = new OddEvenSums();
}
String s = "122164154695";
preCompute(s);
System.out.println(query(0, 3) ? 1 : 0);
System.out.println(query(1, 2) ? 1 : 0);
System.out.println(query(5, 9) ? 1 : 0);
System.out.println(query(0, 11) ? 1 : 0);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program to check divisibility by
# 11 in subStrings of a number String
MAX = 1000005
# To store sums of even and odd digits
class OddEvenSums:
def __init__(self, e_sum, o_sum):
# Sum of even placed digits
self.e_sum = e_sum
# Sum of odd placed digits
self.o_sum = o_sum
sum = [OddEvenSums(0, 0) for i in range(MAX)]
# This function receives the String
# representation of the number and
# precomputes the sum array
def preCompute(x):
# Initialize everb
sum[0].e_sum = sum[0].o_sum = 0
# Add the respective digits
# depending on whether
# they're even indexed or
# odd indexed
for i in range(len(x)):
if (i % 2 == 0):
sum[i + 1].e_sum = (sum[i].e_sum +
int(x[i]))
sum[i + 1].o_sum = sum[i].o_sum
else:
sum[i + 1].o_sum = (sum[i].o_sum +
int(x[i]))
sum[i + 1].e_sum = sum[i].e_sum
# This function receives l and r representing
# the indices and prints the required output
def query(l, r):
diff = ((sum[r + 1].e_sum -
sum[r + 1].o_sum) -
(sum[l].e_sum -
sum[l].o_sum))
if (diff % 11 == 0):
return True
else:
return False
# Driver code
if __name__=="__main__":
s = "122164154695"
preCompute(s)
print(1 if query(0, 3) else 0)
print(1 if query(1, 2) else 0)
print(1 if query(5, 9) else 0)
print(1 if query(0, 11) else 0)
# This code is contributed by rutvik_56
C#
// C# program to check
// divisibility by 11 in
// subStrings of a number String
using System;
class GFG{
static int MAX = 1000005;
// To store sums of even
// and odd digits
public class OddEvenSums
{
// Sum of even placed digits
public int e_sum;
// Sum of odd placed digits
public int o_sum;
};
// Auxiliary array
static OddEvenSums []sum =
new OddEvenSums[MAX];
// Utility function to
// evaluate a character's
// integer value
static int toInt(char x)
{
return x - 48;
}
// This function receives the
// String representation of the
// number and precomputes the sum array
static void preCompute(String x)
{
// Initialize everb
sum[0].e_sum = sum[0].o_sum = 0;
// Add the respective digits
// depending on whether they're
// even indexed or odd indexed
for (int i = 0; i < x.Length; i++)
{
if (i % 2 == 0)
{
sum[i + 1].e_sum = sum[i].e_sum +
toInt(x[i]);
sum[i + 1].o_sum = sum[i].o_sum;
}
else
{
sum[i + 1].o_sum = sum[i].o_sum +
toInt(x[i]);
sum[i + 1].e_sum = sum[i].e_sum;
}
}
}
// This function receives l and r
// representing the indices and
// prints the required output
static bool query(int l, int r)
{
int diff = (sum[r + 1].e_sum -
sum[r + 1].o_sum) -
(sum[l].e_sum -
sum[l].o_sum);
return (diff % 11 == 0);
}
// Driver function to check the program
public static void Main(String[] args)
{
for (int i = 0; i < MAX; i++)
{
sum[i] = new OddEvenSums();
}
String s = "122164154695";
preCompute(s);
Console.WriteLine(query(0, 3) ? 1 : 0);
Console.WriteLine(query(1, 2) ? 1 : 0);
Console.WriteLine(query(5, 9) ? 1 : 0);
Console.WriteLine(query(0, 11) ? 1 : 0);
}
}
// This code is contributed by gauravrajput1
输出:
1
1
0
1