【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)\)

posted @ 2025-08-09 17:07  TimeSpacerui  阅读(5)  评论(0)    收藏  举报