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 ",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; }