Advertisement
Guest User

Untitled

a guest
Apr 21st, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <math.h>
  4. #include <cstdio>
  5. using namespace std;
  6. long long int eq[4]={1,0,0,1};
  7.  
  8. long long int* multiply(long long int c1[], long long int c2[],int r){
  9. long long int *c = new long long int[4];
  10. c[0] = (c1[0]*c2[0] + c1[1]*c2[2]) % r;
  11. c[1] = (c1[0]*c2[1] + c1[1]*c2[3]) % r;
  12. c[2] = (c1[2]*c2[0] + c1[3]*c2[2]) % r;
  13. c[3] = (c1[2]*c2[1] + c1[3]*c2[3]) % r;
  14. return c;
  15. }
  16.  
  17.  
  18.  
  19. void build(long long int t[][4], long long int a[][4], long long int i, long long int tree_left, long long int tree_right, int r){
  20. if (tree_left == tree_right){
  21. return;
  22. }
  23. if (tree_right - tree_left == 1){
  24. t[i][0]= a[tree_left][0];
  25. t[i][1]= a[tree_left][1];
  26. t[i][2]= a[tree_left][2];
  27. t[i][3]= a[tree_left][3];
  28. }else{
  29. long long int tree_middle = (tree_left + tree_right) / 2;
  30. build (t, a, 2 * i + 1, tree_left, tree_middle, r);
  31. build (t, a, 2 * i + 2, tree_middle, tree_right, r);
  32. t[i][0]=multiply(t[2 * i + 1], t[2 * i + 2], r)[0];
  33. t[i][1]=multiply(t[2 * i + 1], t[2 * i + 2], r)[1];
  34. t[i][2]=multiply(t[2 * i + 1], t[2 * i + 2], r)[2];
  35. t[i][3]=multiply(t[2 * i + 1], t[2 * i + 2], r)[3];
  36. }
  37. return;
  38. }
  39.  
  40. long long int* d_proizv(long long int t[][4], long long int i, long long int l, long long int r__, long long int a, long long int b,int r){
  41. if (r__ < a || b < l){
  42.  
  43. return eq;
  44. }
  45. if (l >= a && r__ <= b){
  46. return t[i];
  47. }
  48. long long int m = l - (l - r__) / 2;
  49. return multiply(d_proizv(t, 2 * i + 1, l, m, a, b, r), d_proizv( t, 2 * i + 2, m + 1, r__, a, b, r), r);
  50. }
  51.  
  52. long long int step_2( long long int n){
  53. int i = 1;
  54. while(i < n){
  55. i *= 2;
  56. }
  57. return i*2;
  58. }
  59.  
  60. int main() {
  61. ios_base::sync_with_stdio(false);
  62. ifstream fin("crypto.in");
  63. ofstream fout("crypto.out");
  64. long long int r, n, m, l, r_;
  65. fin >> r >> n >> m;
  66. long long int k = step_2(n);
  67. long long int tr[k/2][4];
  68. for ( int i = 0; i < k/2; i++){
  69. if (i >= n){
  70. tr[i][0]=1;
  71. tr[i][1]=0;
  72. tr[i][2]=0;
  73. tr[i][3]=1;
  74. }else{
  75. fin >> tr[i][0] >> tr[i][1]>>tr[i][2] >> tr[i][3];
  76. }
  77. }
  78. long long int tree[k - 1][4];
  79. build(tree, tr, 0, 0, k/2, r);
  80. for (long long int i = 0; i < m; i++){
  81. fin >> l >> r_;
  82. if (l==r_) {
  83. fout<<tr[l-1][0]<<" "<<tr[l-1][1]<<"\n"<<tr[l-1][2]<<" "<<tr[l-1][3]<<"\n";
  84. } else {
  85.  
  86. fout<<d_proizv(tree, 0, 0, k/2 - 1, l - 1, r_ - 1, r)[0]<<" ";
  87. fout<<d_proizv(tree, 0, 0, k/2 - 1, l - 1, r_ - 1, r)[1]<<"\n";
  88. fout<<d_proizv(tree, 0, 0, k/2 - 1, l - 1, r_ - 1, r)[2]<<" ";
  89. fout<<d_proizv(tree, 0, 0, k/2 - 1, l - 1, r_ - 1, r)[3]<<"\n";}
  90. }
  91. fin.close();
  92. fout.close();
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement