-
Notifications
You must be signed in to change notification settings - Fork 0
/
ProjectEuler205.py
28 lines (25 loc) · 1.44 KB
/
ProjectEuler205.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
project euler problem 205
ピーターは4面のサイコロを9つ持っている. サイコロの各面には1, 2, 3, 4と書いてある.
コリンは6面のサイコロを6つ持っている. サイコロの各面には1, 2, 3, 4, 5, 6と書いてある.
ピーターとコリンはサイコロを投じ, 出た目の合計を比べる. 合計が多い方が勝ちである.
もし出た目の合計が等しければ勝負は引き分けになる.
ピーターがコリンに勝つ確率はいくつだろうか? 10進7桁にroundし, 0.abcdefgという形で回答欄に入力せよ.
"""
import time
import itertools
t0 = time.time()
all_count = (4 ** 9) * (6 ** 6)
ans_count = 0
# 二つのリストはそれぞれの合計の現れる通り数を入れた。list49[23],list66[23]はそれぞれ23の現れる数
list49 = (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 45, 165, 486, 1206, 2598, 4950, 8451, 13051, 18351, 23607,
27876, 30276, 30276, 27876, 23607, 18351, 13051, 8451, 4950, 2598, 1206, 486, 165, 45, 9, 1, 0)
list66 = (0, 0, 0, 0, 0, 0, 1, 6, 21, 56, 126, 252, 456, 756, 1161, 1666, 2247, 2856, 3431, 3906,
4221, 4332, 4221, 3906, 3431, 2856, 2247, 1666, 1161, 756, 456, 252, 126, 56, 21, 6, 1, 0)
for i, j in itertools.product(range(1, 37), repeat=2):
if i > j:
ans_count += list49[i] * list66[j]
print(round(1.0 * ans_count / all_count, 7))
print(time.time() - t0, "seconds")