Official

B - Christmas Trees Editorial by yuto1115

解説

まずは問題を単純化するため、 \(L\)\(R\) から \(A\) を引き、クリスマスツリーは座標が \(M\) の倍数である各地点に立っているものとします。

座標が \(kM\) である地点に立っているクリスマスツリーの番号を \(k\) とします。「座標が \(L\) 未満の地点にあるクリスマスツリーのうち一番東にあるものの番号」および「座標が \(R\) 以下の地点にあるクリスマスツリーのうち一番東にあるものの番号」をそれぞれ \(l, r\) とすると、答えは \(r-l\) になります。

あとは、ある \(x\) に対して「座標が \(x\) 以下の地点にあるクリスマスツリーのうち一番東にあるものの番号」が求められればよいですが、これは \(\lfloor \frac{x}{M} \rfloor\) という簡単な式で表されます。\(x\) が負の数であるときの \(\lfloor \frac{x}{M} \rfloor\) の求め方は使用するプログラミング言語の仕様によって異なるため注意してください(例えば C++ においては単に x / M とするだけでは誤りです)。また、\(\frac{x}{M}\) を浮動小数点数を用いて実数として計算した上で floor をとる、という方針は、用いる浮動小数点数の精度次第では誤差が原因で誤った値を返してしまうので注意してください。

実装例 (C++) :

#include<bits/stdc++.h>

using namespace std;

using ll = long long;

ll floor(ll x, ll m) {
    ll r = (x % m + m) % m;
    return (x - r) / m;
}

int main() {
    ll a, m, l, r;
    cin >> a >> m >> l >> r;
    l -= a, r -= a;
    cout << floor(r, m) - floor(l - 1, m) << endl;
}

実装例 (Python) :

a, m, l, r = map(int, input().split())
l -= a
r -= a
print(r // m - (l - 1) // m)

posted:
last update: