DIV + MOD-Codeforces

投稿日: 更新日:

問題リンク-DIV + MOD

問題

以下の関数を考えます。

fa(x)=xa+xmodaf_a(x) = \left \lfloor \frac{x}{a} \right \rfloor + x\mod a

aaは定数でxxll以上rr以下(lxr)(l \leqq x \leqq r)の時fa(x)f_a(x)が最大となるxxを求めてください。

解法

場合分けをして考えます。

la=ra\left \lfloor \frac{l}{a} \right \rfloor = \left \lfloor \frac{r}{a} \right \rfloorの場合

lxrl \leqq x \leqq rの範囲でxa\left \lfloor \frac{x}{a} \right \rfloorの値は変化しないのでxmodax \mod aの取りうる最大の値を求めればよいです。その値はrmodar \mod aとなります。

lara\left \lfloor \frac{l}{a} \right \rfloor \neq \left \lfloor \frac{r}{a} \right \rfloorの場合

xxllからrrへと変化させるとき、ra1\left \lfloor \frac{r}{a} \right \rfloor - 1からra\left \lfloor \frac{r}{a} \right \rfloorへと変わる瞬間があります。この変化の直前にxmoda=a1x \mod a = a-1となり最大値の候補の1つが得られます。
もう1つの候補はx=rx = rの時でxa\left \lfloor \frac{x}{a} \right \rfloorが最大となる時なのでこの2つの候補を比較すれば良いです。

実装

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

void solve(){
    int l, r, a;
    cin >> l >> r >> a;

    if(l/a == r/a){
        cout << r/a + r%a << endl;
    }else{
        int ans = max(r/a - 1 + a-1, r/a + r%a);
        cout << ans << endl;
    }
}

int main(){
    int t;
    cin >> t;
    while(t--){
        solve();
    }
    return 0;
}

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人