AT2038
Solution
数学题 .
我们不妨设
先考虑特殊情况 :
然后 , 我们用
我们很容易知道 ,
#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
int n,s;
int f(int b,int n) {
if(n<b) return n;
return f(b,n/b)+(n%b);
}
int check(int b) {
if(f(b,n)==s) return 1;
return 0;
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>s;
if(n<s) {cout<<-1;return 0;}
if(n==s) {cout<<n+1;return 0;}
int d=n-s,ans=LONG_LONG_MAX;
ffor(i,1,sqrt(d)) if(d%i==0) {
if(check(i+1)) ans=min(ans,i+1);
if(check(d/i+1)) ans=min(ans,d/i+1);
}
if(ans==LONG_LONG_MAX) {cout<<-1;return 0;}
cout<<ans;
return 0;
}