比赛 |
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;
}