Right now she actually isn't. But she will be, if you don't solve this problem.
You are given integers n, k, A and B. There is a number x, which is initially equal to n. You are allowed to perform two types of operations:
- Subtract 1 from x. This operation costs you A coins.
- Divide x by k. Can be performed only if x is divisible by k. This operation costs you B coins.
The first line contains a single integer n (1 ≤ n ≤ 2·109).
The second line contains a single integer k (1 ≤ k ≤ 2·109).
The third line contains a single integer A (1 ≤ A ≤ 2·109).
The fourth line contains a single integer B (1 ≤ B ≤ 2·109).
Output a single integer — the minimum amount of coins you have to pay to make x equal to 1.
9
2
3
1
6
5
5
2
20
8
19
3
4
2
12
In the first testcase, the optimal strategy is as follows:
- Subtract 1 from x (9 → 8) paying 3 coins.
- Divide x by 2 (8 → 4) paying 1 coin.
- Divide x by 2 (4 → 2) paying 1 coin.
- Divide x by 2 (2 → 1) paying 1 coin.
The total cost is 6 coins.
In the second test case the optimal strategy is to subtract 1 from x 4 times paying 8 coins in total.
题目的意思是给你两种操作,一种是每次减1消耗a元,一种是每次除以k每次消耗b元。使n变成1的最小消耗。
在每次没有达到k的倍数前,只能减一,达到后判断下消耗是减去还是除以小,选小的。
#include<map> #include<cmath> #include<queue> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define maxn 100010 #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; int main() { ll n,k,a,b; while( cin >> n >> k >> a >> b ) { ll ans = 0; if( k == 1 ) { cout << ( n - 1 ) * a << endl; continue; } while( n != 1 ) { if( n % k == 0 ) { ans += min( ( n - n / k ) * a, b ); n /= k; } else if( n > k ) { ans += ( n % k ) * a; n -= n % k; } else { ans += ( n - 1 ) * a; n = 1; } } cout << ans << endl; } return 0; }