Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. int **identityMatrix;
  7. int ***t;
  8.  
  9. int **matrixTwoByTwoMultiplication(int remainder, int **first, int **second) {
  10.     int **result = new int *[2];
  11.     for (size_t i = 0; i < 2; ++i) {
  12.         result[i] = new int[2];
  13.         for (size_t j = 0; j < 2; ++j) {
  14.             result[i][j] = i == j ? 1 : 0;
  15.         }
  16.     }
  17.     result[0][0] = (((first[0][0] * second[0][0])) + ((first[0][1] * second[1][0]))) % remainder;
  18.     result[0][1] = (((first[0][0] * second[0][1])) + ((first[0][1] * second[1][1]))) % remainder;
  19.     result[1][0] = (((first[1][0] * second[0][0])) + ((first[1][1] * second[1][0]))) % remainder;
  20.     result[1][1] = (((first[1][0] * second[0][1])) + ((first[1][1] * second[1][1]))) % remainder;
  21.     return result;
  22. }
  23.  
  24. int **query(int remainder, int index, int l, int r, int a, int b) {
  25.     if ((a > r) || (b < l)) {
  26.         return identityMatrix;
  27.     } else if ((l >= a) && (r <= b)) {
  28.         return t[index];
  29.     }
  30.     int m = l + (r - l) / 2;
  31.     return matrixTwoByTwoMultiplication(remainder, query(remainder, 2 * index + 1, l, m, a, b),
  32.                                         query(remainder, 2 * index + 2, m + 1, r, a, b));
  33. }
  34.  
  35. int main() {
  36.     ifstream anxiety("crypto.in");
  37.     int remainder, n, m;
  38.     anxiety >> remainder >> n >> m;
  39.     string blank;
  40.  
  41.     identityMatrix = new int *[2];
  42.     for (size_t i = 0; i < 2; ++i) {
  43.         identityMatrix[i] = new int[2];
  44.         for (size_t j = 0; j < 2; ++j) {
  45.             identityMatrix[i][j] = i == j ? 1 : 0;
  46.         }
  47.     }
  48.  
  49.     //buildExtendedArray
  50.     int power = 1;
  51.     while (power < n) {
  52.         power *= 2;
  53.     }
  54.     t = new int **[2 * power - 1];
  55.     for (size_t i = 0; i < 2 * power - 1; ++i) {
  56.         t[i] = new int *[2];
  57.         for (size_t j = 0; j < 2; ++j) {
  58.             t[i][j] = new int[2];
  59.             for (size_t k = 0; k < 2; ++k) {
  60.                 t[i][j][k] = 0;
  61.             }
  62.         }
  63.     }
  64.     for (int i = 0; i < n; ++i) {
  65.         int f, s;
  66.         anxiety >> f >> s;
  67.         t[power + i - 1][0][0] = f;
  68.         t[power + i - 1][0][1] = s;
  69.         anxiety >> f >> s;
  70.         t[power + i - 1][1][0] = f;
  71.         t[power + i - 1][1][1] = s;
  72.     }
  73.     //filling in with identity matrices
  74.     for (int i = n; i < power; ++i) {
  75.         t[power + i - 1] = identityMatrix;
  76.     }
  77.     int i = power - 2;
  78.     while (i > -1) {
  79.         t[i] = matrixTwoByTwoMultiplication(remainder, t[2 * i + 1], t[2 * i + 2]);
  80.         i--;
  81.     }
  82.  
  83.     ofstream depression("crypto.out");
  84.     for (i = 0; i < m; ++i) {
  85.         int a, b;
  86.         anxiety >> a >> b;
  87.         int **result = query(remainder, 0, 0, power - 1, a - 1, b - 1);
  88.         depression << result[0][0] << " " << result[0][1] << endl;
  89.         depression << result[1][0] << " " << result[1][1] << endl;
  90.         depression << "" << endl;
  91.         for (int j = 0; j < 2; ++j) {
  92.             delete[] result[j];
  93.         }
  94.         delete[] result;
  95.     }
  96.  
  97.     anxiety.close();
  98.     depression.close();
  99.     for (i = 0; i < 2 * power - 1; ++i) {
  100.         for (int j = 0; j < 2; ++j) {
  101.             delete[] t[i][j];
  102.         }
  103.         delete[] t[i];
  104.     }
  105.     delete[] t;
  106.     for (i = 0; i < 2; ++i) {
  107.         delete[] identityMatrix[i];
  108.     }
  109.     delete[] identityMatrix;
  110.  
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement