显示代码纯文本
#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;
}