[C++] 纯文本查看 复制代码 #include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int>PII;
void solve(){
string str;
int n;
cin>>n;
vector f(19,vector(3,vector<int>(19,-1)));
auto dfs=[&](auto dfs,int u,int lst,int lead0,int cnt,int limit)->int{
if(u==str.size()){
if(cnt>=2)return 1;
else return 0;
}
if(lst!=-1&&!lead0&&!limit&&f[u][lst][cnt]!=-1)return f[u][lst][cnt];
int maxx=9,ans=0;
if(limit)maxx=str[u]-'0';
for(int i=0;i<=maxx;i++){
int t=i&1;
if(lst!=-1&&(t^lst)==0)continue;
if(lead0&&i==0){
ans+=dfs(dfs,u+1,-1,1,0,limit&&(i==maxx));
}else{
ans+=dfs(dfs,u+1,i&1,0,cnt+1,limit&&(i==maxx));
}
}
if(!limit&&lst!=-1)f[u][lst][cnt]=ans;
return ans;
};
auto check=[&](int mid)->bool{
str=to_string(mid);
for(int i=0;i<=18;i++)
for(int j=0;j<=1;j++)
for(int k=0;k<=18;k++)f[i][j][k]=-1;
return dfs(dfs,0,-1,1,0,1)>=n;
};
check(5);
int l=1,r=1e18;
while(l+1<r){
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid;
}
cout<<r<<endl;
}
signed main(){
int t=1;ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
// cin>>t;
while(t--)solve();
return 0;
} |