Submission #936365


Source Code Expand

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.function.BiFunction;

public class Main {
  Scanner sc = new Scanner(System.in);

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

  int n, k;
  double[][][] memo;
  boolean[][][] done;

  double dfs(int i, int j, int b) {
    if (j > k) {
      return 0;
    }
    if (i == n) {
      return b;
    }
    if (done[i][j][b]) {
      return memo[i][j][b];
    }
    double p = 0;
    p += ((double) i / (i + 1)) * dfs(i + 1, j, b); // 今までのより小さいので、bは前のものを引き継ぐ
    p += ((double) 1 / (i + 1)) * Math.max(dfs(i + 1, j, 0), dfs(i + 1, j + 1, 1));

    memo[i][j][b] = p;
    done[i][j][b] = true;
    return memo[i][j][b];
  }

  void run() {
    n = ni();
    k = ni();

    memo = new double[n + 1][k + 1][2];
    done = new boolean[n + 1][k + 1][2];

    System.out.println(dfs(0, 0, 0));
  }

  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;

    BIT(int n, BiFunction<T, T, T> bif, T defaultValue) {
      this.n = n;
      bit = new ArrayList<>(n + 1);
      for (int i = 0; i < n + 1; ++i) {
        bit.add(defaultValue);
      }
      this.bif = bif;
    }

    void update(int i, T v) {
      for (int x = i; x <= n; x += x & -x) {
        bit.set(x, bif.apply(bit.get(x), v));
      }
    }

    T reduce(int i, T defaultValue) {
      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;

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

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

Submission Info

Submission Time
Task B - せんべい
User arukuka
Language Java8 (OpenJDK 1.8.0)
Score 100
Code Size 2485 Byte
Status AC
Exec Time 851 ms
Memory 110704 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 3
AC × 28
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 1_003.txt, 1_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt
Case Name Status Exec Time Memory
0_000.txt AC 129 ms 9808 KB
0_001.txt AC 129 ms 9684 KB
0_002.txt AC 148 ms 11676 KB
1_003.txt AC 127 ms 9684 KB
1_004.txt AC 129 ms 9684 KB
1_005.txt AC 129 ms 9680 KB
1_006.txt AC 129 ms 9680 KB
1_007.txt AC 129 ms 9684 KB
1_008.txt AC 129 ms 9684 KB
1_009.txt AC 130 ms 9792 KB
1_010.txt AC 144 ms 10820 KB
1_011.txt AC 131 ms 9796 KB
1_012.txt AC 131 ms 9668 KB
1_013.txt AC 144 ms 10692 KB
1_014.txt AC 152 ms 12644 KB
1_015.txt AC 153 ms 12416 KB
1_016.txt AC 150 ms 12780 KB
1_017.txt AC 145 ms 11492 KB
1_018.txt AC 143 ms 10876 KB
1_019.txt AC 143 ms 10996 KB
1_020.txt AC 148 ms 11072 KB
1_021.txt AC 138 ms 11240 KB
1_022.txt AC 152 ms 12444 KB
1_023.txt AC 155 ms 13472 KB
1_024.txt AC 145 ms 11092 KB
1_025.txt AC 135 ms 11272 KB
1_026.txt AC 129 ms 9684 KB
1_027.txt AC 851 ms 110704 KB