题目描述
给定整数n和m, 将1到n的这n个整数按字典序排列之后, 求其中的第m个数。
对于n=11, m=4, 按字典序排列依次为1, 10, 11, 2, 3, 4, 5, 6, 7, 8, 9, 因此第4个数是2.
输入描述:
输入仅包含两个整数n和m。
数据范围:
对于20%的数据, 1 <= m <= n <= 5 ;
对于80%的数据, 1 <= m <= n <= 10^7 ;
对于100%的数据, 1 <= m <= n <= 10^18.
输出描述:
输出仅包括一行, 即所求排列中的第m个数字.
C++代码:
//主要采用字典树的思想
#include<iostream>
using namespace std;
long get_num(long long k,long long n){
long long base=1,count=0;
while((k+1)*base-1<=n){
count+=base;
base*=10;
}
if(k*base<=n)
count+=n-k*base+1;
return count;
}
long long ans(long long n,long long m){
long long k=1;
while(m){
long long count=get_num(k,n);
if(count>=m){
m--;
if(!m) break;
k*=10;
}
else{
k++;
m-=count;
}
}
return k;
}
int main(){
long long n,m;
cin>>n>>m;
cout<<ans(n,m)<<endl;
return 0;
}