题意: 解法: 显然答案满足单调性. 那么二分答案,O(len)check即可. 由于M比较大,导致check过程中数字耶会很大,可能爆longlong,可以用__int128来做. 注意特判len==1的情况: 此时如果len==1且X<=M,那么输出1,否则输出0. code: #include<bits/stdc++.h> #define int long long #define llx __int128 using namespace std; const int maxm=2e6+5; char x[maxm]; int a[maxm],len; int m; bool check(int i){ llx t=0; for(int j=1;j<=len;j++){ t=t*i+a[j]; if(t>m)return 0; } return 1; } void solve(){ cin>>(x+1)>>m; len=strlen(x+1); for(int i=1;i<=len;i++){ a[i]=x[i]-'0'; } if(len==1&&a[1]<=m){//这里要特判 cout<<1<<endl; return ; } int d=0; for(int i=1;i<=len;i++){ d=max(d,a[i]); } int ans=-1; int l=d+1,r=m; while(l<=r){ int mid=(l+r)/2; if(check(mid)){ ans=mid,l=mid+1; }else{ r=mid-1; } } if(ans==-1)ans=0; else ans=ans-(d+1)+1; cout<<ans<<endl; } signed main(){ solve(); return 0; }