POJ 1019 Number Sequence

来源:互联网 发布:淘宝店铺注册步骤 编辑:程序博客网 时间:2024/04/25 10:26

      这个题目我在很久以前做过,不过是很蠢的方法,结果还是用了16ms,现在几乎是暴力都能0ms AC,一年的时间过得好快,两年的时间也好快。。。。我的方法应该很好理解,首先是要一路减下去,先确定这个数是在 多大 的范围内,然后再确定。我先自己确定了一下2147483647个数 大约在1-150000范围内。所以是10^6,t=10;故最多是 10^7。这样做不会爆。

代码:

#include<iostream>using namespace std;int num[10]={0,9,99,999,9999,99999,999999,9999999};void Solve(int i,int n){     if( n%i==0)         printf("%d\n",(n/i+num[i-1])%10);     else{          for(int j=1;j<=6;j++){                  if( n%i==j){                      printf( "%d\n",(n/i+1+num[i-1])%(num[i-j+1]+1)/(num[i-j]+1) );                      break;                  }          }     }}int main(){    int n,t;    scanf("%d",&t);    int cnt=0,i,x;    while( t--){           scanf("%d",&n);           cnt=0;           for( i=1; n>0;i++){                if( i<10){                    cnt+=1;                    n-=cnt;                }                else if( i<100){                     cnt+=2;                     n-=cnt;                }                else if( i<1000){                         cnt+=3;                         n-=cnt;                }                else if( i<10000){                         cnt+=4;                         n-=cnt;                }                else if( i<100000){                         cnt+=5;                         n-=cnt;                }                else{                     cnt+=6;                     n-=cnt;                }           }  //确定这个数是几;            n+=cnt;                     for( i=1; i<=6;i++){   //进一步缩小到是几位的                 x=i*(num[i]-num[i-1]);                if( n>x)                    n-=x;                else                    break;           }                  Solve(i,n);    }                          return 0;}