我的代码能力被虐爆了,惨不忍睹。
学到了数字字典序的方法,
大于原数且字典序比他小的一定是他的原数减一在后面添9(10^n除外)
eg: 比233大且字典序比他小的是 1000~2329 10000~23299 .....
个数就是1330 13300 133000....每次做差比较即可,
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL mypow[20];
int main()
{
mypow[0] = 1;
for( LL i = 1;i <= 20;i++ ){
mypow[i] = mypow[i-1]*10;
}
LL n,m;
scanf("%lld%lld",&n,&m);
if(n==1&&m!=1)cout<<0<<endl;
else if(n==10&&m!=2)cout<<0<<endl;
else if(n==100&&m!=3)cout<<0<<endl;
else if(n==1000&&m!=4)cout<<0<<endl;
else if(n==10000&&m!=5)cout<<0<<endl;
else if(n==100000&&m!=6)cout<<0<<endl;
else if(n==1000000&&m!=7)cout<<0<<endl;
else if(n==10000000&&m!=8)cout<<0<<endl;
else if(n==100000000&&m!=9)cout<<0<<endl;
else if(n==1000000000&&m!=10)cout<<0<<endl;
else{
m--;
LL wei = 17;
while( n / mypow[wei] == 0 ) wei--; wei++;
LL base = (n - mypow[wei-1])*10;
LL re = 0;
for( LL i = wei-1;i >= 0;i-- ){
LL x = n / mypow[i];
re += x- mypow[ wei-i-1 ]+1;
}
re--;
m -=re;
if( m < 0 ){
printf("0\n");
return 0;
}
if( m == 0 ){
printf("%lld",n);
return 0;
}
while( m - base > 0 ){
m -= base;
base *= 10;
wei++;
}
LL ans = mypow[ wei ] + m-1;
printf("%lld",ans);
}
return 0;
}