比赛 EYOI与SBOI开学欢乐赛11th 评测结果 AAAAAAAAAA
题目名称 WHZ 的数字 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.046 s
代码语言 C++ 内存使用 2.87 MiB
提交时间 2022-10-14 20:02:36
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,t;
ll f[30],pw[30]={1};
int p[30],len=0; 
ll dp(int pt,bool sm,bool zero){
	if (pt<=1)return 1;
	if (sm&&zero&&f[pt]!=-1)return f[pt];
	ll now=0;int lim=(sm)?9:p[pt];
	for (int i=0;i<=lim;i++){
		if (!i){
			if (!zero)now+=dp(pt-1,sm|(i<p[pt]),zero|(i!=0));	
			else if (!sm&&!p[pt])now+=(t%pw[pt-1]+1)+dp(pt-1,sm|(i<p[pt]),zero|(i!=0));
			else now+=pw[pt-1]+dp(pt-1,sm|(i<p[pt]),zero|(i!=0));
		}
		else now+=dp(pt-1,sm|(i<p[pt]),zero|(i!=0));
	}
	return (sm&&zero)?f[pt]=now:now;
}
ll calc(ll x){
	len=0;t=x;
	while(x!=0){
		p[++len]=x%10;
		x/=10;
	}
	return dp(len,0,0);
}
int main(){
	freopen ("whz_number.in","r",stdin);
	freopen ("whz_number.out","w",stdout);
	memset(f,-1,sizeof(f));
	for (int i=1;i<=20;i++)pw[i]=pw[i-1]*10;
	while(scanf("%lld%lld",&n,&k)!=EOF){
		ll l=0,r=n,num=calc(n)-k+1;
		while(l<r){
			ll mid=(l+r)/2;
			if (calc(mid)<num)l=mid+1;
			else r=mid;
		}
		printf("%lld\n",l);
	}
	return 0;
}