• C


    https://vjudge.net/contest/367072#problem/C
    套娃题qwq

    第k个位置它肯定会在一个区间里,[1234567891011][123456789101112],这样是两个区间
    先确定第k位所在区间的最大的数是几位数,比如这个区间[123456789101112]就是两位数;
    假设是3位数,那么它就会有900个区间,
    再确定答案区间在这个900个区间里是第几个,
    随之你就确定了这个区间和目标位置在区间里是第几位;
    然后再确定目标位置在这个区间里是占的是几位数
    比如这个区间][123456789101112],它占了最后一位,那也就是12,两位数;
    比如1000,1001,(1)002
    然后你再确定它在这些四位数里是第几个
    目标位置是括号那里,那么它在这些四位数里是第3个
    随之你就能确定它在这个数里是第几位
    然后就可以过题啦!

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #define inf 2147483647
    #define N 10000
    #define p(a) putchar(a)
    #define For(i,a,b) for(long long i=a;i<=b;++i)
    
    using namespace std;
    long long T,l,r,k,t,mid,L,R,cnt;
    long long a[N],b[N],c[N],d[N];
    void in(long long &x){
        long long y=1;char c=getchar();x=0;
        while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
        while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=getchar();}
        x*=y;
    }
    void o(long long x){
        if(x<0){p('-');x=-x;}
        if(x>9)o(x/10);
        p(x%10+'0');
    }
    
    bool check(long long x){
        long long l=b[t-1]+t,r=l+(x-1)*t;
        return ((l+r)*x/2)<k;
    }
    
    long long sum(long long x){
        long long l=b[t-1]+t,r=l+(x-1)*t;
        return (l+r)*x/2;
    }
    
    void deal(long long x){
        if(x>9) deal(x/10);
        d[++cnt]=x%10;
    }
    
    signed main(){
        c[1]=1;
        For(i,2,9) c[i]=c[i-1]*10;
        k=9;
        For(i,1,9){
            l=r+i;r=(k-1)*i+l;
            a[i]=a[i-1]+(l+r)*k/2;
            k*=10;
        }
        k=9;
        For(i,1,9){
            b[i]=b[i-1]+k*i;
            k*=10;
        }
        in(T);
        while(T--){
            in(k);
            For(i,1,9){
                if(a[i]>=k){
                    t=i;
                    break;
                }
            }
            k-=a[t-1];
            l=1;r=1e9;
            while(l<r){
                mid=(l+r)>>1;
                if(check(mid)) l=mid+1;
                else r=mid;
            }
            k-=sum(l-1);
            For(i,1,9){
                if(b[i]>=k){
                    t=i;
                    break;
                }
            }
            k-=b[t-1];
            L=k/t;
            R=k%t;
            if(R==0){
                long long temp=c[t]+L-1;
                o(temp%10);p('
    ');
            }
            else{
                cnt=0;
                long long temp=c[t]+L;
                deal(temp);
                o(d[R]);p('
    ');
            }
        }
        return 0;
    }
  • 相关阅读:
    day⑥:logging模块
    day⑥:shelve模块
    day⑥:xml模块
    day⑤:冒泡排序
    day⑤:模块
    day⑤:re深入
    day④:递归
    day④:迭代器
    day④:装饰器
    day③:函数式编程
  • 原文地址:https://www.cnblogs.com/war1111/p/12663033.html
Copyright © 2020-2023  润新知