社区讨论
1.01s TLE求调😭
P10958启示录参与者 6已保存回复 37
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 37 条
- 当前快照
- 1 份
- 快照标识符
- @mm3cgm9a
- 此快照首次捕获于
- 2026/02/26 18:52 2 周前
- 此快照最后确认于
- 2026/02/28 09:25 上周
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
int tt,x;
int l=666,r=1e9;
int f[15][15][15][2];
int a[15];
int len;
int t[15]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
int dfs(int pos,int pre1,int pre2,int is,bool limit,bool lead){
if(is&&!limit&&!lead){//如果已经找到666 后面随便填
return t[len-pos+1];
}
if(pos>len){
return is;
}
if(!limit&&!lead&&f[pos][pre1][pre2][is]!=-1){
return f[pos][pre1][pre2][is];
}
int up=limit?a[pos]:9;
int res=0;
for(int i=0;i<=up;++i){
bool new_is=is;
bool new_limit=limit&&(i==up);
bool new_lead=lead&&(i==0);
int new_pre1=pre1,new_pre2=pre2;
if(!new_lead){
if(is||(pre1==6&&pre2==6&&i==6)) new_is=1;
new_pre1=i;
new_pre2=pre1;
}
res+=dfs(pos+1,new_pre1,new_pre2,new_is,new_limit,new_lead);
}
if(!limit&&!lead) f[pos][pre1][pre2][is]=res;
return res;
}
bool check(int k){
memset(f,-1,sizeof f);
int kk=k;
int num=0,cnt=0;
while(kk){
a[++cnt]=kk%10;
kk/=10;
}
reverse(a+1,a+cnt+1);
len=cnt;
return dfs(1,0,0,0,1,1)>=x;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>tt;
while(tt--){
cin>>x;
l=666,r=1e18;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)){
r=mid;
}
else l=mid+1;
}
cout<<l<<'\n';
}
return 0;
}
回复
共 37 条回复,欢迎继续交流。
正在加载回复...