【链接】h在这里写链接

【题意】

给两个数字a,b,每次操作可以把a+1a+1,或把a∗k

问至少多少次操作可以使得a=b.

1<=a,b<=10^18,0 <= k <= 10^18

【题解】

可以逆向考虑。
现在给你一个b.
让你把它变成a.
如果b是k的倍数,那么肯定优先除k,这样减少的比较多。
否则,就只能一个一个地减少了。直到变成k的倍数为止。

【错的次数】

0

【反思】

逆向考虑一下,就没那么麻烦了。

【代码】

#include <bits/stdc++.h>
using namespace std;
long long a, b, k,ans;
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    cin >> a >> b >> k;
    for (;k > 1 && a <= b / k; ans += b%k + 1, b /= k);
    cout << ans + b - a << endl;
    return 0;
}