题解:AT_arc173_a [ARC173A] Neq Number
简单二分。
思路
数位 dp 预处理和判断。
init 预处理出 dp 数组,与 windy 数大致相同。
二分答案,如果
query 直接当 check 用。
AC code:
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
int dp[100][100];
int l,r;
void init(){
for(int i=0;i<=9;i++){
dp[1][i]=1;
}
for(int i=2;i<=19;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
if(j!=k){
dp[i][j]+=dp[i-1][k];
}
}
}
}
}
int query(int x){
if(x==0){
return 0;
}
int num[25],cnt=0,ans=0;
while(x!=0){
cnt++;
num[cnt]=x%10;
x/=10;
}
for(int i=cnt;i>=1;i--){
for(int j=0;j<num[i];j++){
if(i==cnt&&j==0)continue;
if(i!=cnt&&num[i+1]==j)continue;
ans+=dp[i][j];
}
if(i!=cnt&&num[i]==num[i+1])break;
if(i==1)ans++;
}
for(int i=cnt-1;i>=1;i--){
for(int j=1;j<=9;j++){
ans+=dp[i][j];
}
}
return ans;
}
signed main(){
init();
int t,k;
cin>>t;
while(t--){
cin>>k;
int lt=-1,rt=1e15+1;
while(lt+1!=rt){
int mid=(lt+rt)/2;
if(query(mid)>=k){
rt=mid;
}
else{
lt=mid;
}
}
cout<<rt<<endl;
}
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18575280
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期