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.
题意:将n变为1,有两种方式①n-1花费a,②如果n能够被k整除,n=n/k,花费b
求最小花费
思路:n不能被k整除,直接用方式1;如果能整除要判断两种花费的最小值,折优录取
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ios_base::sync_with_stdio(0);
ll n,k,a,b;
scanf("%lld%lld%lld%lld",&n,&k,&a,&b);
if(k==1){ //k==1 要特判
printf("%lld\n",(n-1)*a);
return 0;
}
ll ans=0;
while(n>1){
if(n%k){
int m=n%k;
n-=m;
if(n<1) ans+=a*(m-1);
else ans+=a*m;
}
else{
int m=n/k;
if((n-m)*a<b) ans+=(n-m)*a;
else ans+=b;
n=m;
}
}
printf("%lld\n",ans);
return 0;
}