logo

Poeilutės dalijimasis iš 11 užklausų

Duotas didelis skaičius n (turintis skaičių skaitmenis iki 10^6) ir įvairios toliau pateiktos formos užklausos:

java prioritetų eilė
Query(l r) : find if the sub-string between the indices l and r (Both inclusive) are divisible by 11. 


Pavyzdžiai:   



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.

Žinome, kad bet kuris skaičius dalijasi iš 11, jei skirtumas tarp nelyginių indeksuotų skaitmenų sumos ir lyginių indeksuotų skaitmenų sumos dalijasi iš 11 t.y. 
Suma (skaitmenys nelyginėse vietose) – suma (skaitmenys lyginėse vietose) turėtų dalytis iš 11 .
Taigi idėja yra iš anksto apdoroti pagalbinį masyvą, kuris saugotų skaitmenų sumą nelyginėse ir lyginėse vietose. 
Norėdami įvertinti užklausą, galime naudoti pagalbinį masyvą, kad į ją atsakytume 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<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 bool query(int lint 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 int main() {  string s = '122164154695';  preCompute(s);  cout << query(0 3) << endl;  cout << query(1 2) << endl;  cout << query(5 9) << endl;  cout << query(0 11) << endl;  return 0; } 
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  
JavaScript
<script> // Javascript program to check divisibility by 11 in // subStrings of a number String let MAX = 1000005; // To store sums of even and odd digits class OddEvenSums {  constructor()  {  this.e_sum = 0;  this.o_sum = 0;    } } // Auxiliary array let sum = new Array(MAX); // Utility function to evaluate a character's // integer value function toInt(x) {  return x.charCodeAt(0) - 48; } // This function receives the String representation // of the number and precomputes the sum array function 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 (let i = 0; i < x.length; i++)  {  if (i % 2 == 0)  {  sum[i + 1].e_sum = sum[i].e_sum + parseInt(x[i]);  sum[i + 1].o_sum = sum[i].o_sum;  }  else  {  sum[i + 1].o_sum = sum[i].o_sum + parseInt(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 function query(lr) {  let 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 for (let i = 0; i < MAX; i++) {  sum[i] = new OddEvenSums(); } let s = '122164154695'; preCompute(s); document.write((query(0 3) ? 1 : 0)+'  
'
); document.write((query(1 2) ? 1 : 0)+'
'
); document.write((query(5 9) ? 1 : 0)+'
'
); document.write((query(0 11) ? 1 :0)+'
'
); // This code is contributed by unknown2108 </script>

Išvestis:   

1 1 0 1