社区讨论

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 条回复,欢迎继续交流。

正在加载回复...