結果
| 問題 | No.58 イカサマなサイコロ |
| コンテスト | |
| ユーザー |
takeya_okino
|
| 提出日時 | 2017-06-16 09:19:26 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 133 ms / 5,000 ms |
| コード長 | 1,603 bytes |
| 記録 | |
| コンパイル時間 | 2,504 ms |
| コンパイル使用メモリ | 77,076 KB |
| 実行使用メモリ | 54,088 KB |
| 最終ジャッジ日時 | 2024-10-01 06:38:17 |
| 合計ジャッジ時間 | 3,941 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
// dp1[i][j]は普通のさいころをi+1個投げて和がjとなる確率
double[][] dp1 = new double[N][6 * N + 1];
// dp2[i][j]はイカサマさいころをmin(K, i+1)個、普通のさいころをi+1-min(K, i+1)個投げて和がjとなる確率
double[][] dp2 = new double[N][6 * N + 1];
for(int j = 1; j <= 6; j++) {
dp1[0][j] = (double)1 / (double)6;
}
for(int i = 1; i < N; i++) {
for(int j = 0; j < 6 * N + 1; j++) {
for(int k = 1; k <= 6; k++) {
if(j - k > 0) dp1[i][j] += (double)1 / (double)6 * dp1[i - 1][j - k];
}
}
}
if(K > 0) {
for(int j = 4; j <= 6; j++) {
dp2[0][j] = (double)1 / (double)3;
}
} else {
for(int j = 1; j <= 6; j++) {
dp2[0][j] = (double)1 / (double)6;
}
}
for(int i = 1; i < N; i++) {
for(int j = 0; j < 6 * N + 1; j++) {
if(i < K) {
for(int k = 4; k <= 6; k++) {
if(j - k > 0) dp2[i][j] += (double)1 / (double)3 * dp2[i - 1][j - k];
}
} else {
for(int k = 1; k <= 6; k++) {
if(j - k > 0) dp2[i][j] += (double)1 / (double)6 * dp2[i - 1][j - k];
}
}
}
}
double ans = 0;
for(int j1 = 1; j1 < 6 * N + 1; j1++) {
for(int j2 = 1; j2 < j1; j2++) {
ans += dp1[N - 1][j2] * dp2[N - 1][j1];
}
}
System.out.println(ans);
}
}
takeya_okino