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 |
|
|
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 |