Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.15 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.StringTokenizer;
  3.  
  4. public class crypto {
  5.     static StringTokenizer st;
  6.     static int j = 0;
  7.     static int r;
  8.  
  9.     public static void main(String[] args) throws IOException {
  10.         BufferedReader bf = new BufferedReader(new FileReader("crypto.in"));
  11.         st = new StringTokenizer(bf.readLine());
  12.         r = Integer.parseInt(st.nextToken());
  13.         int n = Integer.parseInt(st.nextToken());
  14.         int m = Integer.parseInt(st.nextToken());
  15.         matrix[] tree = new matrix[4 * n];
  16.         matrix[] def = new matrix[n];
  17.         int i = 0;
  18.         while (i < n) {
  19.             st = new StringTokenizer(bf.readLine());
  20.             int a = Integer.parseInt(st.nextToken());
  21.             int b = Integer.parseInt(st.nextToken());
  22.             st = new StringTokenizer(bf.readLine());
  23.             int c = Integer.parseInt(st.nextToken());
  24.             int d = Integer.parseInt(st.nextToken());
  25.             def[i] = new matrix(a, b, c, d);
  26.             i++;
  27.         }
  28.         build(tree, 1, 0, n - 1, def);
  29.         PrintWriter out = new PrintWriter(new FileOutputStream(new File("crypto.out")));
  30.         i = 0;
  31.         while (i < m) {
  32.             st = new StringTokenizer(bf.readLine());
  33.             int a = Integer.parseInt(st.nextToken()) - 1;
  34.             int b = Integer.parseInt(st.nextToken()) - 1;
  35.             matrix ans = mult(tree, 1, 0, n - 1, a, b);
  36.             out.println(ans.a + " " + ans.b);
  37.             out.println(ans.c + " " + ans.d);
  38.             i++;
  39.         }
  40.         out.close();
  41.     }
  42.  
  43.     public static class matrix {
  44.         int a;
  45.         int b;
  46.         int c;
  47.         int d;
  48.  
  49.         public matrix(int a, int b, int c, int d) {
  50.             this.a = a % r;
  51.             this.b = b % r;
  52.             this.c = c % r;
  53.             this.d = d % r;
  54.         }
  55.  
  56.     }
  57.  
  58.     private static void build(matrix[] tree, int n, int left, int right, matrix[] def) {
  59.         if (left == right) {
  60.             tree[n] = def[j];
  61.             j++;
  62.         } else {
  63.             int mid = (left + right) / 2;
  64.             build(tree, n * 2, left, mid, def);
  65.             build(tree, n * 2 + 1, mid + 1, right, def);
  66.             tree[n] = multiply(tree[2 * n], tree[2 * n + 1]);
  67.         }
  68.  
  69.     }
  70.  
  71.     private static matrix multiply(matrix first, matrix second) {
  72.         return new matrix((first.a * second.a + first.b * second.c) % r,
  73.                 (first.a * second.b + first.b * second.d) % r,
  74.                 (first.c * second.a + first.d * second.c) % r,
  75.                 (first.c * second.b + first.d * second.d) % r);
  76.     }
  77.  
  78.     private static matrix mult(matrix[] tree, int v, int left, int right, int l, int r) {
  79.         if (l > r)
  80.             return new matrix(1, 0, 0, 1);
  81.         if (tree[v] == null && (l == left && r == right)) {
  82.             return new matrix(1, 0, 0, 1);
  83.         }
  84.         if (l == left && r == right)
  85.             return tree[v];
  86.         int mid = (left + right) / 2;
  87.         matrix first = mult(tree, v * 2, left, mid, l, Math.min(r, mid));
  88.         matrix second = mult(tree, v * 2 + 1, mid + 1, right, Math.max(l, mid + 1), r);
  89.         return multiply(first, second);
  90.     }
  91.  
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement