hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

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)
B - Minimize Ordering【AC】

 pythonは文字も簡単にソートできるので便利です.

print("".join(sorted(input())))
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)