結果

問題 No.58 イカサマなサイコロ
コンテスト
ユーザー shin
提出日時 2026-06-21 19:04:12
言語 Java
(openjdk 25.0.2)
コンパイル:
javac -encoding UTF8 _filename_
実行:
java -ea -Xmx700m -Xss256M -DONLINE_JUDGE=true _class_
結果
WA  
実行時間 -
コード長 2,328 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 5,084 ms
コンパイル使用メモリ 82,472 KB
実行使用メモリ 42,240 KB
最終ジャッジ日時 2026-06-21 19:04:22
合計ジャッジ時間 6,729 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 4 WA * 6
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import java.util.Scanner;

public class No58 {
	

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int k = scanner.nextInt();
		scanner.close();
		
		int[] diceJiro = new int[n+1];
		diceJiro[0] = 1;
		
		int[] KumiawaseJiro = new int[6*n+1];
		KumiawaseJiro = calcKumiawase(1, diceJiro, KumiawaseJiro);
		
		int[] KumiawaseTaroNormal = new int[6*(n-k)+1];
		
		if(n-k > 0) {
			int[] diceTaroNormal = new int[n-k+1];
			diceTaroNormal[0] = 1;
			KumiawaseTaroNormal = calcKumiawase(1, diceTaroNormal, KumiawaseTaroNormal);
		}
		
		int[] KumiawaseTaroIkasama = new int[6*k+1];
		
		if(k > 0) {
			int[] diceTaroIkasama = new int[k+1];
			diceTaroIkasama[0] = 4;
			KumiawaseTaroIkasama = calcKumiawase(1, diceTaroIkasama, KumiawaseTaroIkasama);
		}
		
		int[] KumiawaseTaro = new int[6*n+1];
		
		if(k == 0) {
			KumiawaseTaro = KumiawaseTaroNormal;
		}else if(k == n) {
			KumiawaseTaro = KumiawaseTaroIkasama;
		}else {
		
			for(int i = 1;i < KumiawaseTaroNormal.length;i++) {
				for(int j = 1;j < KumiawaseTaroIkasama.length;j++ ) {
					KumiawaseTaro[i+j] += KumiawaseTaroNormal[i] * KumiawaseTaroIkasama[j] * 2;  
				}
			}
		}
		
		double[] KakuritsuJiro = new double[6*n+1];
		double[] Kakuritsu = new double[6*n+1];
		for(int i = n+1;i <= 6*n;i++) {
			KakuritsuJiro[i] = KakuritsuJiro[i-1] + (double)KumiawaseJiro[i-1] / Math.pow(6, n);
			Kakuritsu[i]= Kakuritsu[i-1] + KakuritsuJiro[i] * KumiawaseTaro[i] / Math.pow(6, n);
		}
		
		System.out.println(Kakuritsu[6*n]);
	}
	
	
	public static int[] calcKumiawase(int t , int[] dice ,int[] Kumiawase) {
		
		for(int i = dice[t-1];i <= 6;i++) {
			
			dice[t] = i;
			
			if(t== dice.length-1) {
				int dicesum = 0; 
				for(int j = 1;j < dice.length;j++) {
					dicesum += dice[j];
				}
				Kumiawase[dicesum] += calcC(dice);
			}else {
				Kumiawase = calcKumiawase(t+1, dice, Kumiawase);
			}
		}
		
		return Kumiawase;
		
	}
	
	public static int calcC(int[] dice) {
		
		int c = 1;
		
		int[] num = new int[6];
		for(int i = 1;i <= dice.length-1 ;i++) {
			num[dice[i]-1] += 1;
		}
		
		for(int n : num) {
			c *= kai(n);
		}
		
		return  kai(dice.length-1) / c;
		
	}
	
	public static int kai(int k) {
		int p = 1;
		for(int i = 1;i <= k;i++) {
			p *= i;
		}
		return p;
	}
	
	
	
	
	
	

}
0