Advertisement
Spidey2182

Subsequence Supremacy

Jun 27th, 2024
1,001
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 30.24 KB | None | 0 0
  1. /*
  2.     Author: WORTH
  3.     Problem: Subsequence Supremacy
  4. */
  5. // Solution at end
  6. // https://codeforces.com/blog/entry/130859
  7.  
  8. import java.util.*;
  9. import java.io.*;
  10. import java.util.function.*;
  11.  
  12. public class Main {
  13.     static ContestScanner sc = new ContestScanner();
  14.     static FastWriter out = new FastWriter();
  15.  
  16.     public static void main(String[] args) throws Exception {
  17.         // sc = new ContestScanner(new File("input.txt"));
  18.         // out = new FastWriter("output.txt");
  19.  
  20.         boolean debug = args.length > 0 && args[0].equals("-DEBUG");
  21.         if (debug) {
  22.             out.println("New Sample:");
  23.             boolean append = args.length > 1;
  24.             System.setErr(new PrintStream(new FileOutputStream("D:\\Codes\\CPRelatedFiles\\error.txt", append), true));
  25.         }
  26.  
  27.         Thread t = new Thread(null, new ActualSolution(sc, out, debug), "actual_solution", 256 << 20);
  28.         t.setUncaughtExceptionHandler(($, e) -> {
  29.             try {
  30.                 out.flush();
  31.                 throw e;
  32.             } catch (NoSuchElementException fine) {
  33.                 System.exit(0);
  34.             } catch (Throwable issue) {
  35.                 issue.printStackTrace(System.err);
  36.                 System.exit(1);
  37.             }
  38.         });
  39.         t.start();
  40.         t.join();
  41.         out.flush();
  42.         if (debug) main(new String[]{"-DEBUG", "Again"});
  43.     }
  44. }
  45.  
  46. final class Mint { // 1000000007 998244353
  47.     public static long mod = 1000000007;
  48.     public static boolean modIsPrime = true;
  49.     private final long val;
  50.  
  51.     public static final Mint ZERO = new Mint(0L);
  52.     public static final Mint ONE = new Mint(1L);
  53.  
  54.     public static long norm(long val) {
  55.         return (val %= mod) < 0 ? val + mod : val;
  56.     }
  57.  
  58.     public static long norm(Integer val) {
  59.         return norm(val.longValue());
  60.     }
  61.  
  62.     public Mint(long val) {
  63.         this.val = norm(val);
  64.     }
  65.  
  66.     public Mint() {
  67.         this(0);
  68.     }
  69.  
  70.     public Mint(Mint arg) {
  71.         this(arg.val);
  72.     }
  73.  
  74.     public Mint(Integer arg) {
  75.         this(arg.longValue());
  76.     }
  77.  
  78.     public long get() {
  79.         return val;
  80.     }
  81.  
  82.     public Mint add(long arg) {
  83.         return new Mint(this.val + norm(arg));
  84.     }
  85.  
  86.     public Mint add(Mint arg) {
  87.         return add(arg.val);
  88.     }
  89.  
  90.     public Mint add(Integer arg) {
  91.         return add(arg.longValue());
  92.     }
  93.  
  94.     public Mint add(long... args) {
  95.         Mint sum = this;
  96.         for (long a : args)
  97.             sum = sum.add(a);
  98.         return sum;
  99.     }
  100.  
  101.     public Mint add(Mint... args) {
  102.         Mint sum = this;
  103.         for (Mint a : args)
  104.             sum = sum.add(a);
  105.         return sum;
  106.     }
  107.  
  108.     public Mint add(Integer... args) {
  109.         Mint sum = this;
  110.         for (Integer a : args)
  111.             sum = sum.add(a);
  112.         return sum;
  113.     }
  114.  
  115.     public Mint sub(long arg) {
  116.         return new Mint(val - norm(arg));
  117.     }
  118.  
  119.     public Mint sub(Mint arg) {
  120.         return sub(arg.val);
  121.     }
  122.  
  123.     public Mint sub(Integer arg) {
  124.         return sub(arg.longValue());
  125.     }
  126.  
  127.     public Mint mul(long arg) {
  128.         return new Mint(this.val * norm(arg));
  129.     }
  130.  
  131.     public Mint mul(Mint arg) {
  132.         return mul(arg.val);
  133.     }
  134.  
  135.     public Mint mul(Integer arg) {
  136.         return mul(arg.longValue());
  137.     }
  138.  
  139.     public Mint mul(long... args) {
  140.         Mint product = this;
  141.         for (long a : args)
  142.             product = product.mul(norm(a));
  143.         return product;
  144.     }
  145.  
  146.     public Mint mul(Mint... args) {
  147.         Mint product = this;
  148.         for (Mint a : args)
  149.             product = product.mul(a);
  150.         return product;
  151.     }
  152.  
  153.     public Mint mul(Integer... args) {
  154.         Mint product = this;
  155.         for (Integer a : args)
  156.             product = product.mul(norm(a));
  157.         return product;
  158.     }
  159.  
  160.     public Mint div(Mint arg) {
  161.         return mul(arg.inv());
  162.     }
  163.  
  164.     public Mint div(long arg) {
  165.         return div(new Mint(arg));
  166.     }
  167.  
  168.     public Mint div(Integer arg) {
  169.         return div(new Mint(arg));
  170.     }
  171.  
  172.     public Mint inv() {
  173.         if (!modIsPrime)
  174.             throw new ArithmeticException(val + " cannot have inverse with mod " + mod + "!");
  175.         return pow(mod - 2);
  176.     }
  177.  
  178.     public Mint pow(long arg) {
  179.         if (arg < 0)
  180.             return pow(-arg).inv();
  181.         Mint pow = Mint.ONE;
  182.         Mint temp = this;
  183.         while (arg > 0) {
  184.             if ((arg & 1) == 1)
  185.                 pow = pow.mul(temp);
  186.             temp = temp.mul(temp);
  187.             arg = arg >> 1;
  188.         }
  189.         return pow;
  190.     }
  191.  
  192.     public Mint pow(Mint arg) {
  193.         return pow(arg.val);
  194.     }
  195.  
  196.     public Mint pow(Integer arg) {
  197.         return pow(arg.longValue());
  198.     }
  199.  
  200.     @Override
  201.     public boolean equals(Object o) {
  202.         if (this == o)
  203.             return true;
  204.         if (o == null || getClass() != o.getClass())
  205.             return false;
  206.         Mint mint = (Mint) o;
  207.         return val == mint.val;
  208.     }
  209.  
  210.     @Override
  211.     public String toString() {
  212.         return Long.toString(val);
  213.     }
  214. }
  215.  
  216. /**
  217.  * @see <a href = "https://github.com/NASU41/AtCoderLibraryForJava/blob/master/ContestIO/ContestScanner.java">Source code by NASU41 (Slightly Modified)</a>
  218.  */
  219. class ContestScanner {
  220.     private static final long LONG_MAX_TENTHS = 922337203685477580L;
  221.     private static final int LONG_MAX_LAST_DIGIT = 7;
  222.     private static final int LONG_MIN_LAST_DIGIT = 8;
  223.     private final InputStream in;
  224.     private final byte[] buffer = new byte[1024];
  225.     private int ptr = 0;
  226.     private int buflen = 0;
  227.  
  228.     public ContestScanner(InputStream in) {
  229.         this.in = in;
  230.     }
  231.  
  232.     public ContestScanner(File file) throws FileNotFoundException {
  233.         this(new BufferedInputStream(new FileInputStream(file)));
  234.     }
  235.  
  236.     public ContestScanner() {
  237.         this(System.in);
  238.     }
  239.  
  240.     private static boolean isPrintableChar(int c) {
  241.         return 33 <= c && c <= 126;
  242.     }
  243.  
  244.     private boolean hasNextByte() {
  245.         if (ptr < buflen) return true;
  246.         ptr = 0;
  247.         try {
  248.             buflen = in.read(buffer);
  249.         } catch (IOException e) {
  250.             e.printStackTrace();
  251.         }
  252.         return buflen > 0;
  253.     }
  254.  
  255.     private int readByte() {
  256.         if (hasNextByte()) return buffer[ptr++];
  257.         else return -1;
  258.     }
  259.  
  260.     public boolean hasNext() {
  261.         while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
  262.         return hasNextByte();
  263.     }
  264.  
  265.     public String next() {
  266.         if (!hasNext()) throw new NoSuchElementException();
  267.         StringBuilder sb = new StringBuilder();
  268.         int b = readByte();
  269.         while (isPrintableChar(b)) {
  270.             sb.appendCodePoint(b);
  271.             b = readByte();
  272.         }
  273.         return sb.toString();
  274.     }
  275.  
  276.     public String nextLine() {
  277.         if (!hasNext()) throw new NoSuchElementException();
  278.         StringBuilder sb = new StringBuilder();
  279.         int b = readByte();
  280.         while (isPrintableChar(b) || b == ' ') {
  281.             sb.appendCodePoint(b);
  282.             b = readByte();
  283.         }
  284.         return sb.toString().trim();
  285.     }
  286.  
  287.     public String[] nextStringArray(int length) {
  288.         String[] array = new String[length];
  289.         for (int i = 0; i < length; i++) array[i] = this.next();
  290.         return array;
  291.     }
  292.  
  293.     public String[] nextStringArray(int length, UnaryOperator<String> map) {
  294.         String[] array = new String[length];
  295.         for (int i = 0; i < length; i++) array[i] = map.apply(this.next());
  296.         return array;
  297.     }
  298.  
  299.     public String[][] nextStringMatrix(int height, int width) {
  300.         String[][] mat = new String[height][width];
  301.         for (int h = 0; h < height; h++) {
  302.             for (int w = 0; w < width; w++) {
  303.                 mat[h][w] = this.next();
  304.             }
  305.         }
  306.         return mat;
  307.     }
  308.  
  309.     public String[][] nextStringMatrix(int height, int width, UnaryOperator<String> map) {
  310.         String[][] mat = new String[height][width];
  311.         for (int h = 0; h < height; h++) {
  312.             for (int w = 0; w < width; w++) {
  313.                 mat[h][w] = map.apply(this.next());
  314.             }
  315.         }
  316.         return mat;
  317.     }
  318.  
  319.     public char[][] nextCharMatrix(int height, int width) {
  320.         char[][] mat = new char[height][width];
  321.         for (int h = 0; h < height; h++) {
  322.             String s = this.next();
  323.             for (int w = 0; w < width; w++) {
  324.                 mat[h][w] = s.charAt(w);
  325.             }
  326.         }
  327.         return mat;
  328.     }
  329.  
  330.     public char[][] nextCharMatrix(int height, int width, UnaryOperator<Character> map) {
  331.         char[][] mat = new char[height][width];
  332.         for (int h = 0; h < height; h++) {
  333.             String s = this.next();
  334.             for (int w = 0; w < width; w++) {
  335.                 mat[h][w] = map.apply(s.charAt(w));
  336.             }
  337.         }
  338.         return mat;
  339.     }
  340.  
  341.     public int nextInt() {
  342.         long nl = nextLong();
  343.         if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE) throw new NumberFormatException();
  344.         return (int) nl;
  345.     }
  346.  
  347.     public int[] nextIntArray(int length) {
  348.         int[] array = new int[length];
  349.         for (int i = 0; i < length; i++) array[i] = this.nextInt();
  350.         return array;
  351.     }
  352.  
  353.     public int[] nextIntArray(int length, IntUnaryOperator map) {
  354.         int[] array = new int[length];
  355.         for (int i = 0; i < length; i++) array[i] = map.applyAsInt(this.nextInt());
  356.         return array;
  357.     }
  358.  
  359.     public int[][] nextIntMatrix(int height, int width) {
  360.         int[][] mat = new int[height][width];
  361.         for (int h = 0; h < height; h++)
  362.             for (int w = 0; w < width; w++) {
  363.                 mat[h][w] = this.nextInt();
  364.             }
  365.         return mat;
  366.     }
  367.  
  368.     public int[][] nextIntMatrix(int height, int width, IntUnaryOperator map) {
  369.         int[][] mat = new int[height][width];
  370.         for (int h = 0; h < height; h++)
  371.             for (int w = 0; w < width; w++) {
  372.                 mat[h][w] = map.applyAsInt(this.nextInt());
  373.             }
  374.         return mat;
  375.     }
  376.  
  377.     public Integer[] nextIntegerArray(int length) {
  378.         Integer[] array = new Integer[length];
  379.         for (int i = 0; i < length; i++) array[i] = this.nextInt();
  380.         return array;
  381.     }
  382.  
  383.     public Integer[] nextIntegerArray(int length, IntUnaryOperator map) {
  384.         Integer[] array = new Integer[length];
  385.         for (int i = 0; i < length; i++) array[i] = map.applyAsInt(this.nextInt());
  386.         return array;
  387.     }
  388.  
  389.     public Integer[][] nextIntegerMatrix(int height, int width) {
  390.         Integer[][] mat = new Integer[height][width];
  391.         for (int h = 0; h < height; h++)
  392.             for (int w = 0; w < width; w++) {
  393.                 mat[h][w] = this.nextInt();
  394.             }
  395.         return mat;
  396.     }
  397.  
  398.     public Integer[][] nextIntegerMatrix(int height, int width, IntUnaryOperator map) {
  399.         Integer[][] mat = new Integer[height][width];
  400.         for (int h = 0; h < height; h++)
  401.             for (int w = 0; w < width; w++) {
  402.                 mat[h][w] = map.applyAsInt(this.nextInt());
  403.             }
  404.         return mat;
  405.     }
  406.  
  407.     public long nextLong() {
  408.         if (!hasNext()) throw new NoSuchElementException();
  409.         long n = 0;
  410.         boolean minus = false;
  411.         int b = readByte();
  412.         if (b == '-') {
  413.             minus = true;
  414.             b = readByte();
  415.         }
  416.         if (b < '0' || '9' < b) {
  417.             throw new NumberFormatException();
  418.         }
  419.         while (true) {
  420.             if ('0' <= b && b <= '9') {
  421.                 int digit = b - '0';
  422.                 if (n >= LONG_MAX_TENTHS) {
  423.                     if (n == LONG_MAX_TENTHS) {
  424.                         if (minus) {
  425.                             if (digit <= LONG_MIN_LAST_DIGIT) {
  426.                                 n = -n * 10 - digit;
  427.                                 b = readByte();
  428.                                 if (!isPrintableChar(b)) {
  429.                                     return n;
  430.                                 } else if (b < '0' || '9' < b) {
  431.                                     throw new NumberFormatException(String.format("%d%s... is not number", n, Character.toString(b)));
  432.                                 }
  433.                             }
  434.                         } else {
  435.                             if (digit <= LONG_MAX_LAST_DIGIT) {
  436.                                 n = n * 10 + digit;
  437.                                 b = readByte();
  438.                                 if (!isPrintableChar(b)) {
  439.                                     return n;
  440.                                 } else if (b < '0' || '9' < b) {
  441.                                     throw new NumberFormatException(String.format("%d%s... is not number", n, Character.toString(b)));
  442.                                 }
  443.                             }
  444.                         }
  445.                     }
  446.                     throw new ArithmeticException(String.format("%s%d%d... overflows long.", minus ? "-" : "", n, digit));
  447.                 }
  448.                 n = n * 10 + digit;
  449.             } else if (b == -1 || !isPrintableChar(b)) {
  450.                 return minus ? -n : n;
  451.             } else {
  452.                 throw new NumberFormatException();
  453.             }
  454.             b = readByte();
  455.         }
  456.     }
  457.  
  458.     public long[] nextLongArray(int length) {
  459.         long[] array = new long[length];
  460.         for (int i = 0; i < length; i++) array[i] = this.nextLong();
  461.         return array;
  462.     }
  463.  
  464.     public long[] nextLongArray(int length, LongUnaryOperator map) {
  465.         long[] array = new long[length];
  466.         for (int i = 0; i < length; i++) array[i] = map.applyAsLong(this.nextLong());
  467.         return array;
  468.     }
  469.  
  470.     public long[][] nextLongMatrix(int height, int width) {
  471.         long[][] mat = new long[height][width];
  472.         for (int h = 0; h < height; h++)
  473.             for (int w = 0; w < width; w++) {
  474.                 mat[h][w] = this.nextLong();
  475.             }
  476.         return mat;
  477.     }
  478.  
  479.     public long[][] nextLongMatrix(int height, int width, LongUnaryOperator map) {
  480.         long[][] mat = new long[height][width];
  481.         for (int h = 0; h < height; h++)
  482.             for (int w = 0; w < width; w++) {
  483.                 mat[h][w] = map.applyAsLong(this.nextLong());
  484.             }
  485.         return mat;
  486.     }
  487.  
  488.     public Long[] nextLongWrapperArray(int length) {
  489.         Long[] array = new Long[length];
  490.         for (int i = 0; i < length; i++) array[i] = this.nextLong();
  491.         return array;
  492.     }
  493.  
  494.     public Long[] nextLongWrapperArray(int length, LongUnaryOperator map) {
  495.         Long[] array = new Long[length];
  496.         for (int i = 0; i < length; i++) array[i] = map.applyAsLong(this.nextLong());
  497.         return array;
  498.     }
  499.  
  500.     public Long[][] nextLongWrapperMatrix(int height, int width) {
  501.         Long[][] mat = new Long[height][width];
  502.         for (int h = 0; h < height; h++)
  503.             for (int w = 0; w < width; w++) {
  504.                 mat[h][w] = this.nextLong();
  505.             }
  506.         return mat;
  507.     }
  508.  
  509.     public Long[][] nextLongWrapperMatrix(int height, int width, LongUnaryOperator map) {
  510.         Long[][] mat = new Long[height][width];
  511.         for (int h = 0; h < height; h++)
  512.             for (int w = 0; w < width; w++) {
  513.                 mat[h][w] = map.applyAsLong(this.nextLong());
  514.             }
  515.         return mat;
  516.     }
  517.  
  518.     public double nextDouble() {
  519.         return Double.parseDouble(next());
  520.     }
  521.  
  522.     public double[] nextDoubleArray(int length) {
  523.         double[] array = new double[length];
  524.         for (int i = 0; i < length; i++) array[i] = this.nextDouble();
  525.         return array;
  526.     }
  527.  
  528.     public double[] nextDoubleArray(int length, DoubleUnaryOperator map) {
  529.         double[] array = new double[length];
  530.         for (int i = 0; i < length; i++) array[i] = map.applyAsDouble(this.nextDouble());
  531.         return array;
  532.     }
  533.  
  534.     public double[][] nextDoubleMatrix(int height, int width) {
  535.         double[][] mat = new double[height][width];
  536.         for (int h = 0; h < height; h++)
  537.             for (int w = 0; w < width; w++) {
  538.                 mat[h][w] = this.nextDouble();
  539.             }
  540.         return mat;
  541.     }
  542.  
  543.     public double[][] nextDoubleMatrix(int height, int width, DoubleUnaryOperator map) {
  544.         double[][] mat = new double[height][width];
  545.         for (int h = 0; h < height; h++)
  546.             for (int w = 0; w < width; w++) {
  547.                 mat[h][w] = map.applyAsDouble(this.nextDouble());
  548.             }
  549.         return mat;
  550.     }
  551. }
  552.  
  553. /**
  554.  * @see <a href = "https://codeforces.com/profile/uwi">Source code by uwi (Slightly Modified)</a>
  555.  */
  556. class FastWriter {
  557.     private static final int BUF_SIZE = 1 << 13;
  558.     private final byte[] buf = new byte[BUF_SIZE];
  559.     private final OutputStream out;
  560.     private int ptr = 0;
  561.  
  562.     public FastWriter() {
  563.         this(System.out);
  564.     }
  565.  
  566.     public FastWriter(OutputStream os) {
  567.         this.out = os;
  568.     }
  569.  
  570.     public FastWriter(String path) {
  571.         try {
  572.             this.out = new FileOutputStream(path);
  573.         } catch (FileNotFoundException e) {
  574.             throw new RuntimeException(path + " not found!");
  575.         }
  576.     }
  577.  
  578.     private static int countDigits(int l) {
  579.         if (l >= 1000000000) return 10;
  580.         if (l >= 100000000) return 9;
  581.         if (l >= 10000000) return 8;
  582.         if (l >= 1000000) return 7;
  583.         if (l >= 100000) return 6;
  584.         if (l >= 10000) return 5;
  585.         if (l >= 1000) return 4;
  586.         if (l >= 100) return 3;
  587.         if (l >= 10) return 2;
  588.         return 1;
  589.     }
  590.  
  591.     private static int countDigits(long l) {
  592.         if (l >= 1000000000000000000L) return 19;
  593.         if (l >= 100000000000000000L) return 18;
  594.         if (l >= 10000000000000000L) return 17;
  595.         if (l >= 1000000000000000L) return 16;
  596.         if (l >= 100000000000000L) return 15;
  597.         if (l >= 10000000000000L) return 14;
  598.         if (l >= 1000000000000L) return 13;
  599.         if (l >= 100000000000L) return 12;
  600.         if (l >= 10000000000L) return 11;
  601.         if (l >= 1000000000L) return 10;
  602.         if (l >= 100000000L) return 9;
  603.         if (l >= 10000000L) return 8;
  604.         if (l >= 1000000L) return 7;
  605.         if (l >= 100000L) return 6;
  606.         if (l >= 10000L) return 5;
  607.         if (l >= 1000L) return 4;
  608.         if (l >= 100L) return 3;
  609.         if (l >= 10L) return 2;
  610.         return 1;
  611.     }
  612.  
  613.     private void innerFlush() {
  614.         try {
  615.             out.write(buf, 0, ptr);
  616.             ptr = 0;
  617.         } catch (IOException e) {
  618.             throw new RuntimeException("inner flush");
  619.         }
  620.     }
  621.  
  622.     public void flush() {
  623.         innerFlush();
  624.         try {
  625.             out.flush();
  626.         } catch (IOException e) {
  627.             throw new RuntimeException("flush");
  628.         }
  629.     }
  630.  
  631.     public FastWriter print(byte b) {
  632.         buf[ptr++] = b;
  633.         if (ptr == BUF_SIZE) innerFlush();
  634.         return this;
  635.     }
  636.  
  637.     public FastWriter print(char c) {
  638.         return print((byte) c);
  639.     }
  640.  
  641.     public FastWriter print(String s) {
  642.         s.chars().forEach(c -> {
  643.             buf[ptr++] = (byte) c;
  644.             if (ptr == BUF_SIZE) innerFlush();
  645.         });
  646.         return this;
  647.     }
  648.  
  649.     public FastWriter print(int x) {
  650.         if (x == Integer.MIN_VALUE) {
  651.             return print((long) x);
  652.         }
  653.         if (ptr + 12 >= BUF_SIZE) innerFlush();
  654.         if (x < 0) {
  655.             print((byte) '-');
  656.             x = -x;
  657.         }
  658.         int d = countDigits(x);
  659.         for (int i = ptr + d - 1; i >= ptr; i--) {
  660.             buf[i] = (byte) ('0' + x % 10);
  661.             x /= 10;
  662.         }
  663.         ptr += d;
  664.         return this;
  665.     }
  666.  
  667.     public FastWriter print(long x) {
  668.         if (x == Long.MIN_VALUE) {
  669.             return print(String.valueOf(x));
  670.         }
  671.         if (ptr + 21 >= BUF_SIZE) innerFlush();
  672.         if (x < 0) {
  673.             print((byte) '-');
  674.             x = -x;
  675.         }
  676.         int d = countDigits(x);
  677.         for (int i = ptr + d - 1; i >= ptr; i--) {
  678.             buf[i] = (byte) ('0' + x % 10);
  679.             x /= 10;
  680.         }
  681.         ptr += d;
  682.         return this;
  683.     }
  684.  
  685.     public FastWriter print(double x, int precision) {
  686.         if (x < 0) {
  687.             print('-');
  688.             x = -x;
  689.         }
  690.         x += Math.pow(10, -precision) / 2;
  691.         //      if(x < 0){ x = 0; }
  692.         print((long) x).print(".");
  693.         x -= (long) x;
  694.         for (int i = 0; i < precision; i++) {
  695.             x *= 10;
  696.             print((char) ('0' + (int) x));
  697.             x -= (int) x;
  698.         }
  699.         return this;
  700.     }
  701.  
  702.     public FastWriter print(double x) {
  703.         return print(x, 20);
  704.     }
  705.  
  706.     public FastWriter print(Object x) {
  707.         return print(x.toString());
  708.     }
  709.  
  710.     public FastWriter println() {
  711.         return print((byte) '\n');
  712.     }
  713.  
  714.     public FastWriter println(char c) {
  715.         return print(c).println();
  716.     }
  717.  
  718.     public FastWriter println(int x) {
  719.         return print(x).println();
  720.     }
  721.  
  722.     public FastWriter println(long x) {
  723.         return print(x).println();
  724.     }
  725.  
  726.     public FastWriter println(double x, int precision) {
  727.         return print(x, precision).println();
  728.     }
  729.  
  730.     public FastWriter println(double x) {
  731.         return println(x, 20);
  732.     }
  733.  
  734.     public FastWriter println(String s) {
  735.         return print(s).println();
  736.     }
  737.  
  738.     public FastWriter println(Object x) {
  739.         return println(x.toString());
  740.     }
  741.  
  742.     public void printArray(char[] array, String separator) {
  743.         int n = array.length;
  744.         if (n == 0) {
  745.             println();
  746.             return;
  747.         }
  748.         for (int i = 0; i < n - 1; i++) {
  749.             print(array[i]);
  750.             print(separator);
  751.         }
  752.         println(array[n - 1]);
  753.     }
  754.  
  755.     public void printArray(char[] array) {
  756.         this.printArray(array, " ");
  757.     }
  758.  
  759.     public void printArray(char[] array, String separator, java.util.function.UnaryOperator<Character> map) {
  760.         int n = array.length;
  761.         if (n == 0) {
  762.             println();
  763.             return;
  764.         }
  765.         for (int i = 0; i < n - 1; i++) {
  766.             print(map.apply(array[i]));
  767.             print(separator);
  768.         }
  769.         println(map.apply(array[n - 1]));
  770.     }
  771.  
  772.     public void printArray(char[] array, java.util.function.UnaryOperator<Character> map) {
  773.         this.printArray(array, " ", map);
  774.     }
  775.  
  776.     public void printArray(int[] array, String separator) {
  777.         int n = array.length;
  778.         if (n == 0) {
  779.             println();
  780.             return;
  781.         }
  782.         for (int i = 0; i < n - 1; i++) {
  783.             print(array[i]);
  784.             print(separator);
  785.         }
  786.         println(array[n - 1]);
  787.     }
  788.  
  789.     public void printArray(int[] array) {
  790.         this.printArray(array, " ");
  791.     }
  792.  
  793.     public void printArray(int[] array, String separator, java.util.function.IntUnaryOperator map) {
  794.         int n = array.length;
  795.         if (n == 0) {
  796.             println();
  797.             return;
  798.         }
  799.         for (int i = 0; i < n - 1; i++) {
  800.             print(map.applyAsInt(array[i]));
  801.             print(separator);
  802.         }
  803.         println(map.applyAsInt(array[n - 1]));
  804.     }
  805.  
  806.     public void printArray(int[] array, java.util.function.IntUnaryOperator map) {
  807.         this.printArray(array, " ", map);
  808.     }
  809.  
  810.     public void printArray(long[] array, String separator) {
  811.         int n = array.length;
  812.         if (n == 0) {
  813.             println();
  814.             return;
  815.         }
  816.         for (int i = 0; i < n - 1; i++) {
  817.             print(array[i]);
  818.             print(separator);
  819.         }
  820.         println(array[n - 1]);
  821.     }
  822.  
  823.     public void printArray(long[] array) {
  824.         this.printArray(array, " ");
  825.     }
  826.  
  827.     public void printArray(long[] array, String separator, java.util.function.LongUnaryOperator map) {
  828.         int n = array.length;
  829.         if (n == 0) {
  830.             println();
  831.             return;
  832.         }
  833.         for (int i = 0; i < n - 1; i++) {
  834.             print(map.applyAsLong(array[i]));
  835.             print(separator);
  836.         }
  837.         println(map.applyAsLong(array[n - 1]));
  838.     }
  839.  
  840.     public void printArray(long[] array, java.util.function.LongUnaryOperator map) {
  841.         this.printArray(array, " ", map);
  842.     }
  843.  
  844.     public void printArray(double[] array, String separator) {
  845.         int n = array.length;
  846.         if (n == 0) {
  847.             println();
  848.             return;
  849.         }
  850.         for (int i = 0; i < n - 1; i++) {
  851.             print(array[i]);
  852.             print(separator);
  853.         }
  854.         println(array[n - 1]);
  855.     }
  856.  
  857.     public void printArray(double[] array) {
  858.         this.printArray(array, " ");
  859.     }
  860.  
  861.     public void printArray(double[] array, String separator, java.util.function.DoubleUnaryOperator map) {
  862.         int n = array.length;
  863.         if (n == 0) {
  864.             println();
  865.             return;
  866.         }
  867.         for (int i = 0; i < n - 1; i++) {
  868.             print(map.applyAsDouble(array[i]));
  869.             print(separator);
  870.         }
  871.         println(map.applyAsDouble(array[n - 1]));
  872.     }
  873.  
  874.     public void printArray(double[] array, java.util.function.DoubleUnaryOperator map) {
  875.         this.printArray(array, " ", map);
  876.     }
  877.  
  878.     public <T> void printArray(T[] array, String separator) {
  879.         int n = array.length;
  880.         if (n == 0) {
  881.             println();
  882.             return;
  883.         }
  884.         for (int i = 0; i < n - 1; i++) {
  885.             print(array[i]);
  886.             print(separator);
  887.         }
  888.         println(array[n - 1]);
  889.     }
  890.  
  891.     public <T> void printArray(T[] array) {
  892.         this.printArray(array, " ");
  893.     }
  894.  
  895.     public <T> void printArray(T[] array, String separator, java.util.function.UnaryOperator<T> map) {
  896.         int n = array.length;
  897.         if (n == 0) {
  898.             println();
  899.             return;
  900.         }
  901.         for (int i = 0; i < n - 1; i++) {
  902.             print(map.apply(array[i]));
  903.             print(separator);
  904.         }
  905.         println(map.apply(array[n - 1]));
  906.     }
  907.  
  908.     public <T> void printArray(T[] array, java.util.function.UnaryOperator<T> map) {
  909.         this.printArray(array, " ", map);
  910.     }
  911.  
  912.     public <T> void printCollection(Collection<T> collection, String separator) {
  913.         boolean first = true;
  914.         for (T c : collection) {
  915.             if (!first) print(separator);
  916.             first = false;
  917.             print(c);
  918.         }
  919.         println();
  920.     }
  921.  
  922.     public <T> void printCollection(Collection<T> collection) {
  923.         this.printCollection(collection, " ");
  924.     }
  925.  
  926.     public <T> void printCollection(Collection<T> collection, String separator, java.util.function.UnaryOperator<T> map) {
  927.         boolean first = true;
  928.         for (T c : collection) {
  929.             if (!first) print(separator);
  930.             first = false;
  931.             print(map.apply(c));
  932.         }
  933.         println();
  934.     }
  935.  
  936.     public <T> void printCollection(Collection<T> collection, java.util.function.UnaryOperator<T> map) {
  937.         this.printCollection(collection, " ", map);
  938.     }
  939. }
  940.  
  941. class ActualSolution implements Runnable {
  942.  
  943.     boolean debug;
  944.     ContestScanner sc;
  945.     FastWriter out;
  946.  
  947.  
  948.     public ActualSolution(ContestScanner sc, FastWriter out, boolean debug) {
  949.         this.sc = sc;
  950.         this.out = out;
  951.         this.debug = debug;
  952.     }
  953.  
  954.     @SuppressWarnings("unchecked")
  955.     <T> String debugIt(T t) {
  956.         if (t == null) return "null";
  957.         try {
  958.             return debugIt((Iterable<T>) t);
  959.         } catch (ClassCastException e) {
  960.             if (t instanceof int[]) return Arrays.toString((int[]) t);
  961.             else if (t instanceof long[]) return Arrays.toString((long[]) t);
  962.             else if (t instanceof char[]) return Arrays.toString((char[]) t);
  963.             else if (t instanceof float[]) return Arrays.toString((float[]) t);
  964.             else if (t instanceof double[]) return Arrays.toString((double[]) t);
  965.             else if (t instanceof boolean[]) return Arrays.toString((boolean[]) t);
  966.             try {
  967.                 return debugIt((Object[]) t);
  968.             } catch (ClassCastException e1) {
  969.                 return t.toString();
  970.             }
  971.         }
  972.     }
  973.  
  974.     <T> String debugIt(T[] arr) {
  975.         StringBuilder ret = new StringBuilder("[");
  976.         boolean first = true;
  977.         for (T t : arr) {
  978.             if (!first) ret.append(", ");
  979.             first = false;
  980.             ret.append(debugIt(t));
  981.         }
  982.         return ret.append("]").toString();
  983.     }
  984.  
  985.     <T> String debugIt(Iterable<T> it) {
  986.         StringBuilder ret = new StringBuilder("[");
  987.         boolean first = true;
  988.         for (T t : it) {
  989.             if (!first) ret.append(", ");
  990.             first = false;
  991.             ret.append(debugIt(t));
  992.         }
  993.         return ret.append("]").toString();
  994.     }
  995.  
  996.     void debug(Object... obj) {
  997.         if (!debug) return;
  998.  
  999.         System.err.print("#" + Thread.currentThread().getStackTrace()[2].getLineNumber() + ": ");
  1000.         for (Object x : obj)
  1001.             System.err.print(debugIt(x) + " ");
  1002.         System.err.println();
  1003.     }
  1004.  
  1005.  
  1006.     @Override
  1007.     public void run() {
  1008.         pow2 = new Mint[N];
  1009.         pow2[0] = Mint.ONE;
  1010.         for (int i = 1; i < N; i++)
  1011.             pow2[i] = pow2[i - 1].mul(2);
  1012.  
  1013.         int testCases = sc.nextInt();
  1014.         for (int testCase = 1; testCase <= testCases; testCase++) {
  1015.             debug("......");
  1016.             debug("Test case ", testCase);
  1017.  
  1018.             //out.print("Case #");
  1019.             //out.print(testCase);
  1020.             //out.print(": ");
  1021.  
  1022.             solve();
  1023.         }
  1024.     }
  1025.  
  1026.     final int N = 1010;
  1027.     Mint[] pow2;
  1028.  
  1029.     void solve() {
  1030.         int n = sc.nextInt();
  1031.         int k = sc.nextInt();
  1032.         int[] a = sc.nextIntArray(n);
  1033.  
  1034.         Mint[][] dp = new Mint[n + 1][k + 1];
  1035.         for (var asd : dp)
  1036.             Arrays.fill(asd, Mint.ZERO);
  1037.  
  1038.         Mint ans = Mint.ZERO;
  1039.         for (int i = 1; i <= n; i++) {
  1040.             for (int j = 0; j <= k; j++) {
  1041.                 if (j >= a[i - 1])
  1042.                     dp[i][j] = dp[i - 1][j - a[i - 1]];
  1043.                 if (j == a[i - 1])
  1044.                     dp[i][j] = dp[i][j].add(pow2[i - 1]);
  1045.  
  1046.                 if (j == k)
  1047.                     ans = ans.add(pow2[n - i].mul(dp[i][j]));
  1048.  
  1049.                 dp[i][j] = dp[i][j].add(dp[i - 1][j]);
  1050.             }
  1051.         }
  1052.  
  1053.         out.println(ans);
  1054.     }
  1055. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement