【2025.8.9】模拟赛
T1
解法一
答案不超过 \(\log_2 n\)。
最后答案位数肯定很小。
\(n\le 10^9\),所以 \(k\le 1000\) 可以直接暴力计算,剩下的直接枚举 3 位,3 位的和不超过 \(\log_2 n\)。
用二分优化(在位数确定的情况下,进制数越大,答案越不优)。
#include<bits/stdc++.h>
using namespace std;
int t,n,k,ans=1e9;
int dec(int x,int base){
int res=0;
while(x!=0){
res+=x%base;
x/=base;
}
return res;
}
int main(){
freopen("base.in","r",stdin);
freopen("base.out","w",stdout);
cin>>t;
while(t--){
scanf("%d%d",&n,&k);
if(k==n){
printf("1\n");
continue;
}
ans=1e9;
for(int i=2;i<=min(k,1000);++i)
ans=min(ans,dec(n,i));
if(k<=1000){
printf("%d\n",ans);
continue;
}
for(int i=0;i<=ans;++i)
for(int j=0;i+j<=ans;++j){
int l=1,r=k,mid,pos;
while(l<=r){
mid=(l+r)/2;
if((__int128)i*mid*mid+(__int128)j*mid<=n){
pos=mid;
l=mid+1;
}
else r=mid-1;
}
for(int ki=0;i+j+ki<=ans;++ki){
while(pos>=2&&(__int128)i*pos*pos+(__int128)j*pos+ki>n) pos--;
if((__int128)i*pos*pos+(__int128)j*pos+ki==n&&pos>i&&pos>j&&pos>ki) ans=min(ans,i+j+ki);
}
}
printf("%d\n",ans);
}
fclose(stdin);fclose(stdout);
return 0;
}
解法二(来自 xtr)
进制数为 \(\frac{n}{2}\) 时,位数为 2;
进制数为 \(\frac{n}{3}\) 时,位数为 3...
发现:在位数确定的情况下,进制数越大,答案越不优。
所以直接枚举 \(\frac{n}{i}\) 计算。
\(O(n\log n)\)。

浙公网安备 33010602011771号