1. 程式人生 > >2016亞洲區域賽北京賽區K JiLi Number

2016亞洲區域賽北京賽區K JiLi Number

Driver Ji likes the digit “1”. He has an accumulator which shows the sum of input number. He lists all of positive number no more than N and starts counting from one, two, three . . . Every time he counts a number he will add the number of digit “1” in this number to accumulator at the same time. The amazing thing happens! At some times, when he finishes counting a number X, the number which on the accumulator is X exactly, he will regard X as “JiLi Number” which means lucky number. Now he wants to know the number of “JiLi Numbers” and the biggest “JiLi Number” no more than N.

Input

There are several test cases and the each test case is a line contains an positive integer N, (1 < N ≤ 10100)

Output

For each test case, output two integers which donates the number of “JiLi Numbers” and the biggest “JiLi Number”.

Sample Input

1

100000000000

Sample Output

1 1

83 1111111110

 

差一點點兒......真的是沒幹勁啊。

找出規律:

n為1ex-1時,數字1的個數為,x*1e(x-1);

x為10之後,數字增長就無法趕超數字1的個數了,也就是說之後不會再有吉利數了。

雖然感受到了這個關鍵點,還是沒敢打表直接做是怎麼回事???難以置信這道題怎麼這麼玄學。

 

#include <cstdio>
#include <cstring>

const int maxn=110;

char s[maxn];

long long m[83]={
1,
199981,
199982,
199983,
199984,
199985,
199986,
199987,
199988,
199989,
199990,
200000,
200001,
1599981,
1599982,
1599983,
1599984,
1599985,
1599986,
1599987,
1599988,
1599989,
1599990,
2600000,
2600001,
13199998,
35000000,
35000001,
35199981,
35199982,
35199983,
35199984,
35199985,
35199986,
35199987,
35199988,
35199989,
35199990,
35200000,
35200001,
117463825,
500000000,
500000001,
500199981,
500199982,
500199983,
500199984,
500199985,
500199986,
500199987,
500199988,
500199989,
500199990,
500200000,
500200001,
501599981,
501599982,
501599983,
501599984,
501599985,
501599986,
501599987,
501599988,
501599989,
501599990,
502600000,
502600001,
513199998,
535000000,
535000001,
535199981,
535199982,
535199983,
535199984,
535199985,
535199986,
535199987,
535199988,
535199989,
535199990,
535200000,
535200001,
1111111110
};

int main()
{
     while(~scanf("%s",s)){
          int len=strlen(s);
          if(len>10){
               printf("83 1111111110\n");
               continue;
          }
          long long num=0;
          int i;
          for(int i=0;i<len;++i){
               num*=10;
               num+=(s[i]-'0');
          }
          for(i=0;i<83;++i)
               if(num<m[i]) break;
          printf("%d %lld\n",i,m[i-1]);
     }

     return 0;
}