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+;
int T;
void testcase(){
printf("Case %d: ",++T);
}
const int MAXN = 5e4+;
const int MAXM = ;
ll sum[MAXN],pos[MAXN];
int bit[MAXN];
int ans[MAXN*];
void init(){
sum[]=,pos[]=;
for(int i=;i<MAXN;i++){
sum[i]=sum[i-]+log10(1.0*i)+;
pos[i]=pos[i-]+sum[i-];
}
int cnt=;
for(int i=;i<MAXN;i++){
int tmp=i;
int tot=;
while(tmp){
bit[++tot]=tmp%;
tmp/=;
}
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=;i<MAXN;i++){
if(pos[i]>x) break;
}
cout<<ans[x-pos[i-]+];
if(t) puts("");
}
return ;
}