Official

D - 456 Editorial by kyopro_friends


\(3\) つのサイコロの各面を区別することにすると、出目の出方は \(6\times 6\times 6=216\) 通りあります。この \(216\) 通りを全探索し、出目が \(4,5,6\) になっているかを判定しましょう。

判定方法としては、出目の組み合わせ \(6\) 通りを全て確かめる方法の他、「集合として一致しているか」「ソートして \((4,5,6)\) になるか」「積が \(120\) か」などもあります。

言語によっては小数を出力する方法に注意してください。

実装例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
  int a[3][6];
  for(int i=0; i<3; i++){
    for(int j=0; j<6; j++) cin >> a[i][j];
  }

  int ans = 0;
  for(int i=0; i<6; i++){
    for(int j=0; j<6; j++){
      for(int k=0; k<6; k++){
        if(   (a[0][i]==4 && a[1][j]==5 && a[2][k]==6)
           || (a[0][i]==4 && a[1][j]==6 && a[2][k]==5)
           || (a[0][i]==5 && a[1][j]==4 && a[2][k]==6)
           || (a[0][i]==5 && a[1][j]==6 && a[2][k]==4)
           || (a[0][i]==6 && a[1][j]==4 && a[2][k]==5)
           || (a[0][i]==6 && a[1][j]==5 && a[2][k]==4)){
          ans++;
        }
      }
    }
  }
  printf("%.10f\n", ans/216.0);
}

実装例 (Python)

A = []
for _ in range(3):
  Ai = list(map(int, input().split()))
  A.append(Ai)

ans = 0
for x in A[0]:
  for y in A[1]:
    for z in A[2]:
      if sorted([x, y, z]) == [4, 5, 6]:
        ans += 1

print(f"{ans/216: .10f}")

posted:
last update: