在此 Atcoder 问题中获取溢出和 TLE 问题
Getting Overflow and TLE issues in this Atcoder question
我正在解决这个问题:D-Base n (https://atcoder.jp/contests/abc192/tasks/abc192_d)
它指出:
给定一个字符串
X
由 0 到 9 和一个整数组成
米
.
让
d
是最大的数字
X
.
有多少个不同的整数不大于
米
可以通过选择一个整数来获得
n
不小于
d
+
1个
看到
X
作为基地-
n
数?
我反复解决了这个问题(这为我提供了小输入的正确答案)但它给了我 TLE 和溢出问题(请参阅我在 https://atcoder.jp/contests/abc192/submissions/20651499 提交的内容)。社论说一定要用Binary Search,我实现如下。但我仍然没有得到正确的输出。欢迎任何建议。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int M;
bool getInBase(unsigned long long int x, int base){
int i=0;
unsigned long long int ans = 0;
while(x>0){
int temp = x%10;
ans += pow(base,i)*temp;
i++;
x/=10;
if(ans>M) return false;
}
return (ans<M);
}
int main(){
string X;
cin>>X;
cin>>M;
int mx = 0;
unsigned long long orig =0;
for(char x: X){
int sum = (int) x - (int)'0';
if(sum>mx) mx = sum;
orig = orig*10 + ((int)x - (int) '0');
}
int ans=0;
unsigned long long int l = mx+1, r =M+1;
unsigned long long int mid;
while(l<r){
mid = (l+r)/2;
if(getInBase(orig,mid)){
l = mid +1;
}
else{
r = mid-1;
}
}
cout<<l-mx;
}
ll convert(string x, ll base, ll m){
ll ans=0;
ll p=0;
ll cur=1;
for(int i=x.size()-1;i>=0;i--){
if(cur<0 || ans<0)
return m+1;
ans+=(ll)(x[i]-'0')*cur;
cur*=base;
if(ans>m)
return m+1;
}
return ans;
}
void solve(){
ll i, j, m;
string x;
cin>>x>>m;
int n=x.size();
ll mx=0;
for(auto i:x){
mx=max(mx, (ll)(i-'0'));
}
if(n==1){
cout<<(((ll)stoi(x))<=m)<<endl;
return;
}
ll k=(ll)ceil(pow(m*1.0, 1.0/(n-1)));
ll l=mx+1;
ll r=k+1;
ll ans=0;
while(l<=r){
ll mid=l+(r-l)/2;
ll c=convert(x, mid, m);
//cout<<"l = "<<l<<" mid ="<<mid<<" r= "<<r<<" c= "<<c<<endl;
if(c<=m){
ans=max(ans, mid);
l=mid+1;
}else{
r=mid-1;
}
}
cout<<max(0LL, ans-mx)<<endl;
}
我正在解决这个问题:D-Base n (https://atcoder.jp/contests/abc192/tasks/abc192_d)
它指出:
给定一个字符串 X 由 0 到 9 和一个整数组成 米 . 让 d 是最大的数字 X . 有多少个不同的整数不大于 米 可以通过选择一个整数来获得 n 不小于 d + 1个 看到 X 作为基地- n 数?
我反复解决了这个问题(这为我提供了小输入的正确答案)但它给了我 TLE 和溢出问题(请参阅我在 https://atcoder.jp/contests/abc192/submissions/20651499 提交的内容)。社论说一定要用Binary Search,我实现如下。但我仍然没有得到正确的输出。欢迎任何建议。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int M;
bool getInBase(unsigned long long int x, int base){
int i=0;
unsigned long long int ans = 0;
while(x>0){
int temp = x%10;
ans += pow(base,i)*temp;
i++;
x/=10;
if(ans>M) return false;
}
return (ans<M);
}
int main(){
string X;
cin>>X;
cin>>M;
int mx = 0;
unsigned long long orig =0;
for(char x: X){
int sum = (int) x - (int)'0';
if(sum>mx) mx = sum;
orig = orig*10 + ((int)x - (int) '0');
}
int ans=0;
unsigned long long int l = mx+1, r =M+1;
unsigned long long int mid;
while(l<r){
mid = (l+r)/2;
if(getInBase(orig,mid)){
l = mid +1;
}
else{
r = mid-1;
}
}
cout<<l-mx;
}
ll convert(string x, ll base, ll m){
ll ans=0;
ll p=0;
ll cur=1;
for(int i=x.size()-1;i>=0;i--){
if(cur<0 || ans<0)
return m+1;
ans+=(ll)(x[i]-'0')*cur;
cur*=base;
if(ans>m)
return m+1;
}
return ans;
}
void solve(){
ll i, j, m;
string x;
cin>>x>>m;
int n=x.size();
ll mx=0;
for(auto i:x){
mx=max(mx, (ll)(i-'0'));
}
if(n==1){
cout<<(((ll)stoi(x))<=m)<<endl;
return;
}
ll k=(ll)ceil(pow(m*1.0, 1.0/(n-1)));
ll l=mx+1;
ll r=k+1;
ll ans=0;
while(l<=r){
ll mid=l+(r-l)/2;
ll c=convert(x, mid, m);
//cout<<"l = "<<l<<" mid ="<<mid<<" r= "<<r<<" c= "<<c<<endl;
if(c<=m){
ans=max(ans, mid);
l=mid+1;
}else{
r=mid-1;
}
}
cout<<max(0LL, ans-mx)<<endl;
}