只要某数字的十进制表示中有三个连续的 6 ,古代人也认为这是个魔鬼的数,比如 666,1666,6663,16666,6660666
古代典籍中经常用“第X小的魔鬼的数”来指代这些数,
输入XX
,输出对应的第X个魔鬼数
二分 X ,看1~X 有几个这样的数,以此检验
#include <iostream>
#include <vector>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std ;
#define int long long
const int M =1e15;
vector<int> vec;
int f[30][2][10][3];
int dfs(int id,int flag,int cnt,int num){
if(cnt>=3) num=1;
if(id<0) return num;
if(f[id][flag][cnt][num]!=-1) return f[id][flag][cnt][num];
int end =( flag? vec[id]:9 );
int t=0;
for(int i=0;i<=end;i++){
if(i==6)
t+= dfs(id-1,flag&&(i==end),cnt+1,num);
else
t+=dfs(id-1,flag&&(i==end),0,num);
}
if(flag==0) f[id][flag][cnt][num]=t;
return t;
}
int chk(int x){
vec.clear();
while(x){
vec.push_back(x%10);
x/=10;
}
return dfs(vec.size()-1, 1,0,0);
}
void solve(){
int k,ans=0;
int l=0, r= M;
cin>>k;
while(l<=r){
int md=(l+r)/2;
if(chk(md)>=k) ans=md,r=md-1;
else l=md+1;
}
cout<<ans<<endl;
}
signed main(){
memset(f,-1,sizeof f);
int tes;
cin>>tes;
while(tes--)
solve();
}
浙公网安备 33010602011771号