P9560 [SDCPC2023] Math Problem 题解
题目大意
给定两个正整数
- 选择一个整数
x 满足0 \leq x < k ,将n 变为k\times n+x 。该操作每次花费a 枚金币,每次选择的整数x 可以不同。 - 将
n 变为\lfloor \frac{n}{k} \rfloor 。该操作每次花费b 枚金币。其中\lfloor \frac{n}{k} \rfloor 表示小于等于\frac{n}{k} 的最大整数。
给定正整数
思路
我们发现,先乘再除对结果是没有影响的(因为操作一加的值小于
我们假定当前的数为
于是我们可以先枚举出进行操作二的次数(这个过程是
注意特判
AC 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
int main()
{
cin>>T;
while(T--)
{
ll n,k,m,a,b,ans=114514191981011451;
cin>>n>>k>>m>>a>>b;
if(n%m==0)
{
cout<<0<<endl;
continue;
}
if(k==1)
{
cout<<-1<<endl;
continue;
}
for(ll i=0,d=0;;i++,n/=k,d=i*b)
{
if(!n)
{
ans=min(ans,b*i);
break;
}
__int128 l=n,r=n;
while(l%m&&(r/m==l/m))
{
r=r*k+k-1;
l*=k;
d+=a;
}
ans=min(ans,d);
}
cout<<ans<<endl;
}
return 0;
}