Atcoder ABC242 振り返り
modは各演算ごとに行う.
最後にまとめてmodを取ろうとしたせいで,値が途中でおそらく64bitを超え,遅くなりTLEしてしまった.各演算ごとにmodを取るだけでAC出来る事に35分後に気付き800位近く順位を落としてしまった……
A - T-shirt【AC】
A>=Xなら確定で貰える.B>=X>=A+1なら,B-A+1-1人の中からランダムでC人に貰えるので確率は割れば良い.それ以外は確定で貰えない.これをif文で実装する.
A, B, C, X = map(int, input().split()) if A >= X: print(1) elif A+1 <= X <= B: print(C/(B-A)) else: print(0)
C - 1111gal password【AC】
N=2の時を考えます.一桁目が1の時Xになるのは11, 12です.一桁目が2の時Xになるのは21, 22, 23です.一桁目がiの時,整数Xの数を入れたリストをansとします.ans[0]について,整数Xは11, 12の2個,ans[1]について整数Xは21, 22, 23の3個というイメージです.
N=3の時を考えます.一桁目が1の時,Xは111, 112, 121, 122, 123の5個です.一桁目が2の時,Xは211, 212, 221, 222, 223, 231, 232, 233の8個です.ここで,それぞれ下二桁の数字を見ると,一桁目が1の時,下二桁の数字はN=2の時のans[0, 1]のXになっていることが分かります.一桁目が2の時,下二桁の数字はN=2の時のans[0, 1, 2]のXになっています.
つまり,N=3の時のansは,N=2の時のansの値を使えば解ける事が分かります.1か9の時,次の桁取れる数字は2個で,それ以外の時は3個なので,それに合わせ使うansの個数を分岐させます.
同様に,Nの時のansはN-1のansの値を使えば解けます.そしてN=2の時は先ほど求めたようにans = [2, 3, 3, 3, 3, 3, 3, 3, 2]です.
最終的に求めるのはXの総数ですが,それはansの合計を求めれば良いです.
for文の中の演算でmodを取る必要があります.modを取らず最後のprintでのみmodを取った場合TLEとなりました.
N = int(input()) MOD = 998244353 ans = [2, 3, 3, 3, 3, 3, 3, 3, 2] for _ in range(N-2): ans = [(ans[0]+ans[1]) % MOD if i == 0 else (ans[-2]+ans[-1]) % MOD if i == 8 else (ans[i-1]+ans[i]+ans[i+1]) % MOD for i in range(9)] print(sum(ans) % MOD)