masuTomo’s blog

競技プログラミングの勉強メモです.主にPythonを使用します.数学の記事も書くかもしれません.

yukicoder No.959 tree and fire

★2は少し難しく感じます。

問題

No.959 tree and fire - yukicoder

期待値は最近の高校生は学習していない可能性が高いです。
よくわからない人はざっくり平均のことだと思っておきましょう。
ちなみに数学Bの教科書に載っています。

各マス目について木が存在する確率を求めればよい。

  • 角について
    調べたいマス+周り2マスが木であればよく,その確率は p ^ 3
    また,このようなマスは4マスある(角は4つ)。

  • 端(角以外)について
    調べたいマス+周囲3マスが木であればよく,その確率は p ^ 4
    また,このようなマスは 2(N-2) + 2(M-2)マスある。

  • 内部(角,端以外)について
    調べたいマス+周囲4マスが木であればよく,その確率は p ^ 5
    また,このようなマスは (N-2) \times (M-2) マスある。

従って,求める期待値は以下のようになる。
 4p ^ 3 + (2(N-2)+2(N-4)) p ^ 4 + (M-2)(N-2)p ^ 5
N,M,Pの値から直接計算できるのでループ等を用いる必要もない。

注意

N=1のときなどのコーナーケースは場合分けが必要。

  •  N=1かつM=1のとき
    pがそのまま期待値となる

  •  N=1かつM \neq 1のとき(N,Mが逆のときも同じ)
    調べたいマス+周囲2マスが木であればよく,そのようなマスは M-2マスあるので
     2p ^ 2 + (M-2)p ^ 3

ソースコードは以下

N,M = map(int,input().split())
p = float(input())
ans = 0
#1マスのとき
if N == 1 and M == 1:
    print(p)
    exit()
#細長いとき
if (N == 1 and M != 1) or (N != 1 and M == 1):
    E = max(N,M)
    print(2* p**2 + (E-2)* p**3)
    exit()
#それ以外
print(4* p**3 + 2*(M+N-4)* p**4 + (M-2)*(N-2)* p**5 )
余談

最初,上記の考察をしてから各マス目に対して上記の処理をループで実行したらTLEになりました。注意しましょう。