公式

B - Garbage Collection 解説 by sotanishy


「日付を \(q\) で割って \(r\) あまる日」は,日付がある非負整数 \(a\) を用いて \(aq+r\) で表されるような日です.よって,\(d \leq aq + r\) となる最小の \(a\) を求めればよいです.

\(d\)\(q\) で割った商を \(b\),あまりを \(c\) とします.すると, \(d=bq + c\) と表されます.\(c\)\(r\) の大小関係で場合分けします.

\(c \leq r\) のとき,\(d = bq+c \leq aq+r\) となる最小の \(a\)\(a=b\) です.よって,答えは \(bq+r\) です.

\(c > r\) のとき,\(d=bq+c \leq aq+r\) となる最小の \(a\)\(a = b+1\) です.よって,答えは \((b+1)q+r\) です.

実装例 (Python)

N = int(input())
q = [0] * N
r = [0] * N
for i in range(N):
    q[i], r[i] = map(int, input().split())
Q = int(input())
for _ in range(Q):
    t, d = map(int, input().split())
    t -= 1
    b, c = divmod(d, q[t])
    a = b if c <= r[t] else b + 1
    ans = a * q[t] + r[t]
    print(ans)

実装例 (C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<int> q(N), r(N);
    for (int i = 0; i < N; ++i) cin >> q[i] >> r[i];
    int Q;
    cin >> Q;
    while (Q--) {
        int t, d;
        cin >> t >> d;
        --t;
        int b = d / q[t], c = d % q[t];
        int a = c <= r[t] ? b : b + 1;
        int ans = a * q[t] + r[t];
        cout << ans << "\n";
    }
}

投稿日時:
最終更新: