ABC 084
C - Special Trains
問題
- N 個の駅が一直線に並ぶ
- i 番目の駅 (1≤i≤N−1) から、次の駅に向かって時刻 Si から Fi ごとに列車が発車する(列車は次の駅で止まる)
- 次の駅まではそれぞれ Ci かかる
- i 番目の駅 (1≤i≤N) のそれぞれから、N 番目の駅までにかかる所要時間を求めよ
解法
1≤N≤500 なので、各駅からそのままシミュレーションすればいい。
ある駅 i に時刻 t に着いた時、次の駅に到着する時間は、
- まだ最初の運行時刻でない(Si<t)場合、Si+Ci
- そうでなければ、次の発車時刻は
- 「整数 m の倍数で、ある整数 n 以上の最小のもの」は、math.ceil(n/m)×m で求められる
- よって、次の駅に到着する時刻は math.ceil(t/Fi)×Fi+Ci
D - 2017-like Number
問題
- 「N も、(N+1)/2 も素数」である整数を、「2017に似た数」と呼ぶことにする
- Q 個のクエリが与えられる
- 各クエリでは、2つの整数 li,ri が与えられる
- 各クエリについて、「li 以上 ri 以下の『2017に似た数』の個数」を求めよ
解法
制約 1≤l,r≤105 なので、とりあえず 105 までの「2017に似た数」をすべて求める。
105 までの素数をすべて求め、1052 までの素数 p について、2p−1 も素数ならば、2p−1 が「2017に似た数」である。
すべて求めたら、小さい順にソートしておく。各クエリの答えは、二分探索で求められる。
二分探索で、「ri が挿入される位置 ー li が挿入される位置」が、答えとなる。ただし、
- li が「2017に似た数」だった場合、挿入位置は li の位置
- ri が「2017に似た数」だった場合、挿入位置は ri の次の位置
とする。これは、Python の bisect ライブラリでは、bisect_left()
とbisect()
で使い分けられる。