Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.StringTokenizer;
- public class crypto {
- static StringTokenizer st;
- static int j = 0;
- static int r;
- public static void main(String[] args) throws IOException {
- BufferedReader bf = new BufferedReader(new FileReader("crypto.in"));
- st = new StringTokenizer(bf.readLine());
- r = Integer.parseInt(st.nextToken());
- int n = Integer.parseInt(st.nextToken());
- int m = Integer.parseInt(st.nextToken());
- matrix[] tree = new matrix[4 * n];
- matrix[] def = new matrix[n];
- int i = 0;
- while (i < n) {
- st = new StringTokenizer(bf.readLine());
- int a = Integer.parseInt(st.nextToken());
- int b = Integer.parseInt(st.nextToken());
- st = new StringTokenizer(bf.readLine());
- int c = Integer.parseInt(st.nextToken());
- int d = Integer.parseInt(st.nextToken());
- def[i] = new matrix(a, b, c, d);
- i++;
- }
- build(tree, 1, 0, n - 1, def);
- PrintWriter out = new PrintWriter(new FileOutputStream(new File("crypto.out")));
- i = 0;
- while (i < m) {
- st = new StringTokenizer(bf.readLine());
- int a = Integer.parseInt(st.nextToken()) - 1;
- int b = Integer.parseInt(st.nextToken()) - 1;
- matrix ans = mult(tree, 1, 0, n - 1, a, b);
- out.println(ans.a + " " + ans.b);
- out.println(ans.c + " " + ans.d);
- i++;
- }
- out.close();
- }
- public static class matrix {
- int a;
- int b;
- int c;
- int d;
- public matrix(int a, int b, int c, int d) {
- this.a = a % r;
- this.b = b % r;
- this.c = c % r;
- this.d = d % r;
- }
- }
- private static void build(matrix[] tree, int n, int left, int right, matrix[] def) {
- if (left == right) {
- tree[n] = def[j];
- j++;
- } else {
- int mid = (left + right) / 2;
- build(tree, n * 2, left, mid, def);
- build(tree, n * 2 + 1, mid + 1, right, def);
- tree[n] = multiply(tree[2 * n], tree[2 * n + 1]);
- }
- }
- private static matrix multiply(matrix first, matrix second) {
- return new matrix((first.a * second.a + first.b * second.c) % r,
- (first.a * second.b + first.b * second.d) % r,
- (first.c * second.a + first.d * second.c) % r,
- (first.c * second.b + first.d * second.d) % r);
- }
- private static matrix mult(matrix[] tree, int v, int left, int right, int l, int r) {
- if (l > r)
- return new matrix(1, 0, 0, 1);
- if (tree[v] == null && (l == left && r == right)) {
- return new matrix(1, 0, 0, 1);
- }
- if (l == left && r == right)
- return tree[v];
- int mid = (left + right) / 2;
- matrix first = mult(tree, v * 2, left, mid, l, Math.min(r, mid));
- matrix second = mult(tree, v * 2 + 1, mid + 1, right, Math.max(l, mid + 1), r);
- return multiply(first, second);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement