hiro1729 競プロ

競プロの解説などを書きます。

ABC334-B 解説

B - Christmas Trees

$L \le A+kM \le R$ を満たす整数 $k$ の個数を求める問題です。制約が大きいため、全探索では求められません。

これは $L-A \le kM \le R-A$ と言い換えられるので、$L-A$ 以上 $R-A$ 以下の $ M $ の倍数です。$L-A$ と $R-A$ の正負で分けると解くことができます。

Python

A, M, L, R = map(int, input().split())
L -= A
R -= A
if L <= 0:
    if R < 0:
        print(-L // M - (-R - 1) // M)
    else:
        print(R // M + -L // M + 1)
else:
    print(R // M - (L - 1) // M)

C++

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

int main() {
    long long A, M, L, R;
    cin >> A >> M >> L >> R;
    L -= A;
    R -= A;
    if (L <= 0) {
        if (R < 0) {
            cout << -L / M - (-R - 1) / M << '\n';
        } else {
            cout << R / M + -L / M + 1 << '\n';
        }
    } else {
        cout << R / M - (L - 1) / M << '\n';
    }
}

また、以下のように簡単に書くこともできます。(ぜひ考えてみてください。)

Python

A, M, L, R = map(int, input().split())
print((R - A) // M - (L - A - 1) // M)