记录编号 607778 评测结果 AAAAAAAAAA
题目名称 2949.[SYOI 2018] WHZ 的数字 最终得分 100
用户昵称 Gravatar会挽弯弓满月 是否通过 通过
代码语言 C++ 运行时间 0.330 s
提交时间 2025-10-20 20:52:46 内存使用 3.88 MiB
显示代码纯文本
#include <bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
ull n,k;
ull up[25];
ull f[25][25][2][2];
ull dfs(ull x,ull cnt,ull limit,ull lead){
	if(x==0){
		if(lead) return 1;
		else return cnt;
	}
	if(f[x][cnt][limit][lead]!=-1) return f[x][cnt][limit][lead];
	ull maxn,res=0,nlimit,nlead,ncnt;
	maxn=limit?up[x]:9;
	for(ull i=0;i<=maxn;i++){
		nlimit=limit&&(i==maxn);
		nlead=lead&&(i==0);
		ncnt=cnt;
		if(!nlead&&i==0) ncnt++;
		res+=dfs(x-1,ncnt,nlimit,nlead);
	}
	return f[x][cnt][limit][lead]=res;
}
ull solve(ull x){
	ull t=x,len=0;
	while(t){
		up[++len]=t%10;
		t/=10;
	}
	memset(f,-1,sizeof(f));
	return dfs(len,0,1,1);
}
ull l,r,mid,num,ans;
bool check(ull x){
	ull s=solve(x);
	return (num-s>=k);
}
int main(){
	freopen("whz_number.in","r",stdin);
	freopen("whz_number.out","w",stdout);
	while(scanf("%llu%llu",&n,&k)!=EOF){
		num=solve(n);
		l=0;r=n;ans=0;
		while(l<r){
			mid=(l+r)>>1;
			if(check(mid)) l=mid+1;
			else r=mid;
		}
		printf("%llu\n",l);
	}
	return 0;
}