题解:AT_arc173_a [ARC173A] Neq Number

简单二分。

思路

数位 dp 预处理和判断。

init 预处理出 dp 数组,与 windy 数大致相同。

二分答案,如果 11midmid 的 Neq 数数量大于等于 kkrt=midrt=mid;否则 lt=midlt=mid,最后输出 rtrt

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;
}
posted @   KK_SpongeBob  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示