POJ - 1019 Number Sequence (思维)

https://vjudge.net/problem/POJ-1019

题意

给一串1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011这种形式的串,问这个串的第i个位置的数字是什么。

分析

这道题的重点在于到第k组时应该为几位数,即对于某个数x,它应该为几位数。答案是log10(x)+1。这样剩下的便是打表预处理了,找出每组的起始位置,再处理出一个最长的组。

 

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1e9+7;
int T;
void testcase(){
    printf("Case %d: ",++T);
}
const int MAXN = 5e4+10;
const int MAXM = 30;
ll sum[MAXN],pos[MAXN];
int bit[MAXN];
int ans[MAXN*10];
void init(){
    sum[1]=1,pos[1]=1;
    for(int i=2;i<MAXN;i++){
        sum[i]=sum[i-1]+log10(1.0*i)+1;
        pos[i]=pos[i-1]+sum[i-1];
    }
    int cnt=1;
    for(int i=1;i<MAXN;i++){
        int tmp=i;
        int tot=0;
        while(tmp){
            bit[++tot]=tmp%10;
            tmp/=10;
        }
        while(tot){
            ans[cnt++]=bit[tot--];
        }
    }
}
int main() {
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif // LOCAL
    int t;
    ll x;
    scd(t);
    init();
    while(t--){
        cin>>x;
        int i;
        for(i=1;i<MAXN;i++){
            if(pos[i]>x) break;
        }
        cout<<ans[x-pos[i-1]+1];
        if(t) puts("");
    }
    return 0;
}

 

posted @ 2018-07-18 14:42  litos  阅读(168)  评论(0编辑  收藏  举报