問題リンク-DIV + MOD
問題
以下の関数を考えます。
fa(x)=⌊ax⌋+xmoda
aは定数でxはl以上r以下(l≦x≦r)の時fa(x)が最大となるxを求めてください。
解法
場合分けをして考えます。
⌊al⌋=⌊ar⌋の場合
l≦x≦rの範囲で⌊ax⌋の値は変化しないのでxmodaの取りうる最大の値を求めればよいです。その値はrmodaとなります。
⌊al⌋=⌊ar⌋の場合
xをlからrへと変化させるとき、⌊ar⌋−1から⌊ar⌋へと変わる瞬間があります。この変化の直前にxmoda=a−1となり最大値の候補の1つが得られます。
もう1つの候補はx=rの時で⌊ax⌋が最大となる時なのでこの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;
}