Submission #4599613


Source Code Expand

import java.io.*;
import java.math.*;
import java.util.*;
import java.util.stream.*;

public class Main {

	int[] solve() {
		int n = nextInt();
		int b = nextInt() - 1;
		int[] p = new int[n];
		int[] q = new int[n];
		for (int i = 0; i < n; i++) {
			p[i] = nextInt() - 1;
		}
		for (int i = 0; i < n; i++) {
			q[i] = nextInt() - 1;
		}

		if (b == 0) {
			return p;
		}

		int k = (b - 1) / 6;

		int head, tail;
		int[] mid;

		if (b == 6 * k + 1) {
			head = tail = k;
			mid = q;
		} else if (b == 6 * k + 2) {
			head = tail = k;
			mid = mult(inv(p), q);
		} else if (b == 6 * k + 3) {
			head = tail = k;
			mid = mult(inv(q), mult(inv(p), q));
		} else if (b == 6 * k + 4) {
			head = k;
			tail = k + 1;
			mid = inv(q);
		} else if (b == 6 * k + 5) {
			head = k;
			tail = k + 1;
			mid = mult(inv(q), p);
		} else if (b == 6 * k + 6) {
			head = k;
			tail = k + 1;
			mid = mult(mult(inv(q), p), q);
		} else {
			throw new AssertionError();
		}

		// QpqP
		int[] headBlock = mult(mult(mult(inv(q), p), q), inv(p));

		int[] tailBlock = inv(headBlock);

		int[] ret = mult(mult(pow(headBlock, head), mid), pow(tailBlock, tail));

		return ret;
	}

	char flip(char c) {
		if (Character.isLowerCase(c)) {
			return Character.toUpperCase(c);
		} else {
			return Character.toLowerCase(c);
		}
	}

	String inverse(String a) {
		StringBuilder sb = new StringBuilder();
		for (int i = a.length() - 1; i >= 0; i--) {
			sb.append(flip(a.charAt(i)));
		}
		return sb.toString();
	}

	String simplify(String a) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < a.length(); i++) {
			// sb.append(flip(a.charAt(i)));
			if (sb.length() > 0
					&& flip(a.charAt(i)) == sb.charAt(sb.length() - 1)) {
				sb.deleteCharAt(sb.length() - 1);
			} else {
				sb.append(a.charAt(i));
			}
		}
		return sb.toString();
	}

	String f(String a, String b) {
		return simplify(inverse(a) + b);
	}

	int[] inv(int[] p) {
		int[] q = new int[p.length];
		for (int i = 0; i < p.length; i++) {
			q[p[i]] = i;
		}
		return q;
	}

	int[] mult(int[] a, int[] b) {
		int[] c = new int[a.length];
		for (int i = 0; i < a.length; i++) {
			c[i] = b[a[i]];
		}
		return c;
	}

	int[] pow(int[] a, int b) {
		int[] ret = IntStream.range(0, a.length).toArray();
		for (; b > 0; b >>= 1) {
			if ((b & 1) == 1) {
				ret = mult(ret, a);
			}
			a = mult(a, a);
		}
		return ret;
	}

	void test() {
		String[] a = new String[250];
		a[0] = "p";
		a[1] = "q";
		for (int i = 2; i < a.length; i++) {
			a[i] = f(a[i - 2], a[i - 1]);
		}

		for (int i = 0; i < a.length; i++) {
			// System.err.println(i + " " + a[i].length());
			// if (a[i].length() != i) {
			// System.err.println(i);
			// }
			// System.err.println(i + " " + a[i]);
			String s = a[i];
			int beg = 0;
			while (beg + 4 <= s.length()
					&& s.substring(beg, beg + 4).equals("QpqP")) {
				beg += 4;
			}
			// System.err.println(i + " " + s.substring(beg));

			int end = s.length();
			while (end - 4 >= 0 && s.substring(end - 4, end).equals("pQPq")) {
				end -= 4;
			}

			System.err.println(i + " " + beg / 4 + " " + (s.length() - end) / 4
					+ " " + s.substring(beg, end));
		}
	}

	void stress() {
		for (int tst = 0;; tst++) {
			if (false) {
				throw new AssertionError();
			}
			System.err.println(tst);
		}
	}
	
	void submit() {
		int[] ans = solve();
		for (int x : ans) {
			out.print(x + 1 + " ");
		}
	}

	Main() throws IOException {
		is = System.in;
		out = new PrintWriter(System.out);
		submit();
		// stress();
		// test();
		out.close();
	}

	static final Random rng = new Random();
	static final int C = 5;

	static int rand(int l, int r) {
		return l + rng.nextInt(r - l + 1);
	}

	public static void main(String[] args) throws IOException {
		new Main();
	}

	private InputStream is;
	PrintWriter out;

	private byte[] buf = new byte[1 << 14];
	private int bufSz = 0, bufPtr = 0;

	private int readByte() {
		if (bufSz == -1)
			throw new RuntimeException("Reading past EOF");
		if (bufPtr >= bufSz) {
			bufPtr = 0;
			try {
				bufSz = is.read(buf);
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
			if (bufSz <= 0)
				return -1;
		}
		return buf[bufPtr++];
	}

	private boolean isTrash(int c) {
		return c < 33 || c > 126;
	}

	private int skip() {
		int b;
		while ((b = readByte()) != -1 && isTrash(b))
			;
		return b;
	}

	String nextToken() {
		int b = skip();
		StringBuilder sb = new StringBuilder();
		while (!isTrash(b)) {
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}

	String nextString() {
		int b = readByte();
		StringBuilder sb = new StringBuilder();
		while (!isTrash(b) || b == ' ') {
			sb.appendCodePoint(b);
			b = readByte();
		}
		return sb.toString();
	}

	double nextDouble() {
		return Double.parseDouble(nextToken());
	}

	char nextChar() {
		return (char) skip();
	}

	int nextInt() {
		int ret = 0;
		int b = skip();
		if (b != '-' && (b < '0' || b > '9')) {
			throw new InputMismatchException();
		}
		boolean neg = false;
		if (b == '-') {
			neg = true;
			b = readByte();
		}
		while (true) {
			if (b >= '0' && b <= '9') {
				ret = ret * 10 + (b - '0');
			} else {
				if (b != -1 && !isTrash(b)) {
					throw new InputMismatchException();
				}
				return neg ? -ret : ret;
			}
			b = readByte();
		}
	}

	long nextLong() {
		long ret = 0;
		int b = skip();
		if (b != '-' && (b < '0' || b > '9')) {
			throw new InputMismatchException();
		}
		boolean neg = false;
		if (b == '-') {
			neg = true;
			b = readByte();
		}
		while (true) {
			if (b >= '0' && b <= '9') {
				ret = ret * 10 + (b - '0');
			} else {
				if (b != -1 && !isTrash(b)) {
					throw new InputMismatchException();
				}
				return neg ? -ret : ret;
			}
			b = readByte();
		}
	}
}

Submission Info

Submission Time
Task D - A Sequence of Permutations
User mmaxio
Language Java8 (OpenJDK 1.8.0)
Score 1000
Code Size 6048 Byte
Status AC
Exec Time 290 ms
Memory 51760 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1000 / 1000
Status
AC × 3
AC × 43
Set Name Test Cases
Sample sample01.txt, sample02.txt, sample03.txt
All sample01.txt, sample02.txt, sample03.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, sample01.txt, sample02.txt, sample03.txt
Case Name Status Exec Time Memory
in01.txt AC 212 ms 27348 KiB
in02.txt AC 182 ms 28628 KiB
in03.txt AC 182 ms 29524 KiB
in04.txt AC 177 ms 29780 KiB
in05.txt AC 185 ms 28756 KiB
in06.txt AC 163 ms 25672 KiB
in07.txt AC 170 ms 25812 KiB
in08.txt AC 173 ms 28756 KiB
in09.txt AC 181 ms 27856 KiB
in10.txt AC 184 ms 28244 KiB
in11.txt AC 270 ms 47228 KiB
in12.txt AC 279 ms 46760 KiB
in13.txt AC 289 ms 47060 KiB
in14.txt AC 266 ms 43456 KiB
in15.txt AC 270 ms 45144 KiB
in16.txt AC 278 ms 45268 KiB
in17.txt AC 290 ms 47228 KiB
in18.txt AC 269 ms 42564 KiB
in19.txt AC 260 ms 45908 KiB
in20.txt AC 278 ms 46552 KiB
in21.txt AC 280 ms 50132 KiB
in22.txt AC 279 ms 51760 KiB
in23.txt AC 282 ms 49912 KiB
in24.txt AC 276 ms 43224 KiB
in25.txt AC 283 ms 46392 KiB
in26.txt AC 277 ms 44244 KiB
in27.txt AC 274 ms 46044 KiB
in28.txt AC 280 ms 44576 KiB
in29.txt AC 279 ms 48624 KiB
in30.txt AC 282 ms 43648 KiB
in31.txt AC 74 ms 20692 KiB
in32.txt AC 150 ms 26580 KiB
in33.txt AC 150 ms 25808 KiB
in34.txt AC 160 ms 28496 KiB
in35.txt AC 188 ms 23756 KiB
in36.txt AC 154 ms 25556 KiB
in37.txt AC 279 ms 46680 KiB
sample01.txt AC 148 ms 25428 KiB
sample02.txt AC 154 ms 26580 KiB
sample03.txt AC 147 ms 28244 KiB