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
题意:给你一个n,让你把n变成1,每次有两种操作:减一花费A,除以k花费B(整除的前提下),问你最小花费。
思路:简单贪心,当不能整除时变成整除,此时只能减。当整除时,判断除的花费和减的花费,注意特判k==1的情况,防止死循环,因为这个TLE了一发。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,k,a,b,ans;
int main()
{
while(~scanf("%lld%lld%lld%lld",&n,&k,&a,&b))
{
if(k>n||k==1){printf("%lld\n",a*(n-1));continue;}
ans=0;
while(1)
{
if(n%k!=0) //不能整除只能减法,减到整除为止
{
ans+=a*(n%k);
n=n-(n%k);
}
if(n<k) //此时只能减法,除法永远用不到,直接求解答案
{
ans+=a*(n-1);
break;
}
if(n==1)break;
ans+=min(a*(n-n/k),b); //减法和除法取最小花费
n/=k;
if(n==1)break;
}
printf("%lld\n",ans);
}
return 0;
}