Submission #959076


Source Code Expand

import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;

public class Main {
  void run() {
    int n = ni();
    int[] a = new int[n];
    TreeSet<Integer> set = new TreeSet<>();
    for (int i = 0; i < n; ++i) {
      a[i] = ni();
      set.add(a[i]);
    }
    if (a[0] != 0) {
      System.out.println(0);
      return;
    }
    for (int i = 1; i < n; ++i) {
      if (a[i] == 0) {
        System.out.println(0);
        return;
      }
    }
    int v = 0;
    while (set.size() > 0) {
      int w = set.pollFirst();
      if (v != w) {
        System.out.println(0);
        return;
      }
      v++;
    }
    if (v == 1) {
      System.out.println(1);
      return;
    }
    int[] size = new int[v];
    for (int i = 0; i < n; ++i) {
      size[a[i]]++;
    }
    TreeMap<Node, Long> map = new TreeMap<>();
    long seki = 1;
    for (int i = 2; i < v; ++i) {
      int N = size[i - 1];
      int M = size[i];
      long sub = pow(2, (long) N * (N - 1) / 2);
      sub *= pow(pow(2, N) - 1, M);
      sub %= MOD;
      seki *= sub;
      seki %= MOD;
    }
    seki *= pow(2, (long) size[v - 1] * (size[v - 1] - 1) / 2);
    seki %= MOD;
    System.out.println(seki);
  }

  class Node implements Comparable<Node> {
    int n, m;

    Node(int n, int m) {
      this.n = n;
      this.m = m;
    }

    @Override
    public int hashCode() {
      return n ^ m;
    }

    @Override
    public int compareTo(Node node) {
      if (n == node.n) {
        return m - node.m;
      } else {
        return n - node.n;
      }
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (this.getClass() != o.getClass()) {
        return false;
      }
      Node node = (Node) o;
      return n == node.n && m == node.m;
    }
  }

  Scanner sc = new Scanner(System.in);

  public static void main(String[] args) {
    new Main().run();
  }

  int ni() {
    return Integer.parseInt(sc.next());
  }

  void debug(Object... os) {
    System.err.println(Arrays.deepToString(os));
  }

  class BIT<T> {
    int n;
    ArrayList<T> bit;
    BiFunction<T, T, T> bif;

    /**
     * 1-indexed なBinary Indexed Treeを構築する
     *
     * @param n   容量
     * @param bif 適用させる関数
     * @param sup 初期値
     */
    BIT(int n, BiFunction<T, T, T> bif, Supplier<T> sup) {
      this.n = n;
      bit = new ArrayList<>(n + 1);
      for (int i = 0; i < n + 1; ++i) {
        bit.add(sup.get());
      }
      this.bif = bif;
    }

    /**
     * iの位置の値をvで更新する
     *
     * @param i index
     * @param v 新しい値
     */
    void update(int i, T v) {
      for (int x = i; x <= n; x += x & -x) {
        bit.set(x, bif.apply(bit.get(x), v));
      }
    }

    /**
     * クエリー
     *
     * @param defaultValue 初期値
     * @param i            index
     * @return [1, i]までfを適用した結果
     */
    T reduce(T defaultValue, int i) {
      T ret = defaultValue;
      for (int x = i; x > 0; x -= x & -x) {
        ret = bif.apply(ret, bit.get(x));
      }
      return ret;
    }
  }

  long MOD = 1_000_000_007;

  /**
   * 繰り返し2乗法を用いたべき乗の実装
   *
   * @return a^r (mod 1,000,000,007)
   */
  long pow(long a, long r) {
    long sum = 1;
    while (r > 0) {
      if ((r & 1) == 1) {
        sum *= a;
        sum %= MOD;
      }
      a *= a;
      a %= MOD;
      r >>= 1;
    }
    return sum;
  }

  /**
   * 組み合わせ
   * O(n)
   *
   * @return {}_nC_r
   */
  long C(int n, int r) {
    long sum = 1;
    for (int i = n; 0 < i; --i) {
      sum *= i;
      sum %= MOD;
    }
    long s = 1;
    for (int i = r; 0 < i; --i) {
      s *= i;
      s %= MOD;
    }
    sum *= pow(s, MOD - 2);
    sum %= MOD;

    long t = 1;
    for (int i = n - r; 0 < i; --i) {
      t *= i;
      t %= MOD;
    }
    sum *= pow(t, MOD - 2);
    sum %= MOD;

    return sum;
  }

  double GOLDEN_RATIO = (1.0 + Math.sqrt(5)) / 2.0;

  /**
   * 黄金分割探索
   *
   * @param left  下限
   * @param right 上限
   * @param f     探索する関数
   * @param comp  上に凸な関数を探索するときは、Comparator.comparingDouble(Double::doubleValue)
   *              下に凸な関数を探索するときは、Comparator.comparingDouble(Double::doubleValue).reversed()
   * @return 極値の座標x
   */
  double goldenSectionSearch(double left, double right, Function<Double, Double> f, Comparator<Double> comp) {
    double c1 = divideInternally(left, right, 1, GOLDEN_RATIO);
    double c2 = divideInternally(left, right, GOLDEN_RATIO, 1);
    double d1 = f.apply(c1);
    double d2 = f.apply(c2);
    while (right - left > 1e-9) {
      if (comp.compare(d1, d2) > 0) {
        right = c2;
        c2 = c1;
        d2 = d1;
        c1 = divideInternally(left, right, 1, GOLDEN_RATIO);
        d1 = f.apply(c1);
      } else {
        left = c1;
        c1 = c2;
        d1 = d2;
        c2 = divideInternally(left, right, GOLDEN_RATIO, 1);
        d2 = f.apply(c2);
      }
    }
    return right;
  }

  /**
   * [a,b]をm:nに内分する点を返す
   */
  double divideInternally(double a, double b, double m, double n) {
    return (n * a + m * b) / (m + n);
  }

  /**
   * http://qiita.com/p_shiki37/items/65c18f88f4d24b2c528b
   */
  static class FastScanner {
    private final InputStream in;
    private final byte[] buffer = new byte[1024];
    private int ptr = 0;
    private int buflen = 0;

    public FastScanner(InputStream in) {
      this.in = in;
    }

    private boolean hasNextByte() {
      if (ptr < buflen) {
        return true;
      } else {
        ptr = 0;
        try {
          buflen = in.read(buffer);
        } catch (IOException e) {
          e.printStackTrace();
        }
        if (buflen <= 0) {
          return false;
        }
      }
      return true;
    }

    private int readByte() {
      if (hasNextByte()) return buffer[ptr++];
      else return -1;
    }

    private static boolean isPrintableChar(int c) {
      return 33 <= c && c <= 126;
    }

    private void skipUnprintable() {
      while (hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++;
    }

    public boolean hasNext() {
      skipUnprintable();
      return hasNextByte();
    }

    public String next() {
      if (!hasNext()) throw new NoSuchElementException();
      StringBuilder sb = new StringBuilder();
      int b = readByte();
      while (isPrintableChar(b)) {
        sb.appendCodePoint(b);
        b = readByte();
      }
      return sb.toString();
    }

    public long nextLong() {
      if (!hasNext()) throw new NoSuchElementException();
      long n = 0;
      boolean minus = false;
      int b = readByte();
      if (b == '-') {
        minus = true;
        b = readByte();
      }
      if (b < '0' || '9' < b) {
        throw new NumberFormatException();
      }
      while (true) {
        if ('0' <= b && b <= '9') {
          n *= 10;
          n += b - '0';
        } else if (b == -1 || !isPrintableChar(b)) {
          return minus ? -n : n;
        } else {
          throw new NumberFormatException();
        }
        b = readByte();
      }
    }
  }
}

Submission Info

Submission Time
Task B - 最短路問題
User arukuka
Language Java8 (OpenJDK 1.8.0)
Score 100
Code Size 7676 Byte
Status AC
Exec Time 737 ms
Memory 58108 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 4
AC × 46
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt, test_37.txt, test_38.txt, test_39.txt, test_40.txt, test_41.txt, test_42.txt
Case Name Status Exec Time Memory
sample_01.txt AC 292 ms 29220 KB
sample_02.txt AC 282 ms 29208 KB
sample_03.txt AC 282 ms 29316 KB
sample_04.txt AC 295 ms 29220 KB
test_01.txt AC 284 ms 29284 KB
test_02.txt AC 289 ms 29260 KB
test_03.txt AC 287 ms 29268 KB
test_04.txt AC 289 ms 29232 KB
test_05.txt AC 310 ms 30804 KB
test_06.txt AC 312 ms 30416 KB
test_07.txt AC 327 ms 31912 KB
test_08.txt AC 308 ms 30476 KB
test_09.txt AC 360 ms 30848 KB
test_10.txt AC 318 ms 30348 KB
test_11.txt AC 573 ms 52364 KB
test_12.txt AC 567 ms 52220 KB
test_13.txt AC 550 ms 51396 KB
test_14.txt AC 576 ms 52252 KB
test_15.txt AC 557 ms 51380 KB
test_16.txt AC 583 ms 52460 KB
test_17.txt AC 559 ms 51768 KB
test_18.txt AC 583 ms 52620 KB
test_19.txt AC 543 ms 51180 KB
test_20.txt AC 544 ms 50896 KB
test_21.txt AC 567 ms 51324 KB
test_22.txt AC 578 ms 51272 KB
test_23.txt AC 603 ms 52384 KB
test_24.txt AC 600 ms 51984 KB
test_25.txt AC 659 ms 55748 KB
test_26.txt AC 713 ms 58108 KB
test_27.txt AC 737 ms 57260 KB
test_28.txt AC 697 ms 54052 KB
test_29.txt AC 667 ms 55600 KB
test_30.txt AC 596 ms 52248 KB
test_31.txt AC 289 ms 29296 KB
test_32.txt AC 293 ms 29204 KB
test_33.txt AC 307 ms 29248 KB
test_34.txt AC 294 ms 29252 KB
test_35.txt AC 284 ms 29292 KB
test_36.txt AC 282 ms 29180 KB
test_37.txt AC 290 ms 29232 KB
test_38.txt AC 286 ms 29276 KB
test_39.txt AC 284 ms 29180 KB
test_40.txt AC 285 ms 29256 KB
test_41.txt AC 284 ms 29304 KB
test_42.txt AC 286 ms 29284 KB