さかなの思い

競技プログラミングの話が主になるかもしれません

AtCoder Beginner Contest 165 D - Floor Function 解説

感想

Cが解けなさすぎて焦っていたのでDを先に見た。
C++の実装例が最後に載っています。

思考過程

Nが10の12乗くらいあるので、全探索では到底間に合わない。
floor(Ax/B)とA * floor(x/B)はほとんど同じ値になる。違いは、Bで割ったあまりの分だけ。
詳しく述べると、x = Bk + yと表すことができたとする。その場合、
floor(Ax/B) = Ak + floor(Ay/B)
A * floor(x/B) = Ak
となる。よって、yの部分によってのみ答えが求まり、その答えはyの値が大きければ大きいほどよい、ということがわかる。
よって、そのようなyを求めて、答えを計算する。
具体的には、
NがB以上の場合、yとしてB-1を用いると余りが最大になる。
NがBよりも小さい場合、yとしてNを用いると余りが最大になる。

実装

void solve(){
    cin >> a >> b >> n;
    ll k;
    if(n >= b){
        k = b - 1;
    }else{
        k = n;
    }
    ll ans = k * a / b;
    cout << ans << endl;
    return;
}