机房测试:A(数学)+B(二分+曼哈顿距离)+C(性质+二分)
T1: 分析: 写出s变换的式子:(((s+a)*b+a)*b)…… 将式子化简: 又可以把m写成: 也就是将m拆成一个b进制数, 每次贪心地使 i 大的时候xi尽量大 ,那么就可以花费最小次数凑出m。 #include<bits/stdc++.h> using namespace std; #define ri register int #define ll long long int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); ll S,T,a,b; scanf("%lld%lld%lld%lld",&S,&T,&a,&b); ll nowb=1,n=0,ans=(1ll<<62); while(1){ ll t=T-nowb*S; if(t<0) break; if(t%a==0){ ll tot=n,m=t/a; ll bb=nowb; while(m){//把m拆成b进制数 tot+=m/bb; m%=bb; bb/=b; } ans=min(ans,tot); } n++; nowb=nowb*b; } printf("%d\n",ans==(1ll<<62) ? -1 : ans); } /* 10 28 4 2 4685 56756 32764 43856 6 207 5 3