
对下面程序细节的一些补充:通过实验枚举所有的b发现,s>n不可能实现,s==n只有当b>n时能实现,更改一些循环的枚举顺序是为了加快速度
#include<iostream>
#include<cstdio>
#include<cmath>
#include<climits>
using namespace std;
#define ll long long
ll n,s;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>s;
ll sqrt_n=sqrt(n);
ll ans=LLONG_MAX;
if(s==n) ans=n+1;
else if(s>n) ans=-1;
else {
//2<=b<=sqrt_n
for(ll b=2;b<=sqrt_n;b++){
ll t=n,sum=0;
while(t){
sum+=t%b;
t/=b;
}
if(sum==s) {
ans=b;
break;
}
}
if(ans==LLONG_MAX){
for(ll p=sqrt_n;p>=1;p--){
ll b=(n-s)/p+1;
if(b<=1) continue;
ll t=n,sum=0;
while(t){
sum+=t%b;
t/=b;
}
if(sum==s) {
ans=b;
break;
}
}
}
}
if(ans==LLONG_MAX) ans=-1;
cout<<ans<<"\n";
return 0;
}
321

被折叠的 条评论
为什么被折叠?



