公式
B - Garbage Collection 解説
by
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";
}
}
投稿日時:
最終更新:
