940B Our Tanya is Crying Out Loud
题目大意
给你n,k,A,B四个数,x=n,有两种操作:
1.将x-1,需支付A个金币
2.将x÷k,需支付B个金币,当且仅当k能整除x时可进行此操作
问将x修改为1至少要花几个金币
分析
模拟两个过程,如果k能整除x则判断一个一个将x减到想x/k和将x除以k哪个花费的金币少,否则如果x大于k将x减去x模k的余数(不可每次减1,减若干次,否则会超时),x小于k则减去(x-1)。注意特判k等于1的情况。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int main()
{ long long n,m,i,j,k,x,a,b,ans=0;
cin>>n>>k>>a>>b;
x=n;
if(k==1){
cout<<(n-1)*a<<endl;
return 0;
}
while(x!=1){
if(x%k!=0){
if(x>k){
ans+=(x%k)*a;
x=x-x%k;
}else {
ans+=(x-1)*a;
x=1;
}
}else {
if((x-x/k)*a<b){
ans+=(x-x/k)*a;
x=x/k;
}else {
x=x/k;
ans+=b;
}
}
}
cout<<ans<<endl;
return 0;
}