【链接】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; }