Thread: ADC #3 Results

  1. #1
    Code Goddess Prelude's Avatar
    Join Date
    Sep 2001
    Posts
    9,897

    ADC #3 Results

    Here are the results of everyone's entry. As I said, the only category tested was speed:

    Dave_Sinkula: 2234.053ms
    FillYourBrain: 0.691ms
    ygfperson: 0.298ms
    Speedy5: 0.413ms
    Fordy: 0.289ms

    And the winner is Fordy! With ygfperson pushing a very close second.
    My best code is written with the delete key.

  2. #2
    Code Goddess Prelude's Avatar
    Join Date
    Sep 2001
    Posts
    9,897
    Dave_Sinkula's entry:
    Code:
    #include <stdio.h>
    
    /**************************************************************************
     * Description:
     *   Read a file of numbers and print the average.
     *
     * Arguments:
     *   filename - pointer to a string containing the name of the file to read
     *
     * Return Value:
     *   the average of the numbers in the file
     */
    double average(const char *filename)
    {
       size_t  count = 0;                 /* A running total of numbers read. */
       double  result = 0.0;              /* Start with a zero sum.           */
       FILE *file = fopen(filename, "r"); /* Open the file to read.           */
       if ( file != NULL )
       {
          double  number;                 /* A place to scan the number.      */
          while ( fscanf(file, "%lf", &number) == 1 )
          {
             result += number;            /* Update the sum.                  */
             ++count;                     /* Count the numbers as we go.      */
          }
          fclose(file);                   /* Common courtesy.                 */
       }
       else
       {
          perror(filename);               /* Common courtesy.                 */
       }
       result /= count;                   /* Get the average from the sum.    */
       printf("%f\n", result);            /* Show everybody my answer.        */
       return result;
    }
    My best code is written with the delete key.

  3. #3
    Code Goddess Prelude's Avatar
    Join Date
    Sep 2001
    Posts
    9,897
    FillYourBrain's entry:
    Code:
    #include <windows.h>
    #include <iostream>
    
    //Compiled on VC++ 6.0
    //FillYourBrain (Chris Marino)
    //cboard.cprogramming.com "Almost Daily Contest" #3
    #define FILENAME "numbers.txt"
    
    
    //for the record, this hurts me deeply to declare variables global.
    //if I had to code this way in the real world I'd kill myself. :)
    DWORD size;
    int 
         pos = 0,
         numcount = 0,
         remainder;
    char
         readbuf[1024],
         sumbuf[256],
         digitstack[256],
         *digitstackptr,
         *cur_digit1,
         *cur_digit2,
         *readptr,
         *readendptr,
         *tempptr,
         *sumbufend = 0,
         c;
    
    
    inline void AddIt()
         {
         for(cur_digit1 = (digitstackptr-1), cur_digit2 = sumbuf; cur_digit1 >= 
    
    digitstack; cur_digit1--, cur_digit2++)
              {
              tempptr = cur_digit2;
              *tempptr += *cur_digit1;
              while(*tempptr > 9)
                   {
                   *(tempptr++) -= 10;
                   (*tempptr)++;
                   }
              if(tempptr > sumbufend)
                   sumbufend = tempptr;
              }
         numcount++;
         }
    
    inline void DivideIt()
         {
         //numcount, sumbuf, sumbufend, digitstackptr, and digitstack are relevant;
         digitstackptr = digitstack;
         remainder = 0;
         while(sumbufend >= sumbuf)
              {
              remainder *= 10;
              remainder += *(sumbufend--);
              if(remainder >= numcount)
                   {
                   *(digitstackptr++) = remainder / numcount;
                   remainder %= numcount;
                   }
              else
                   if(digitstackptr > digitstack)
                        *(digitstackptr++) = 0;
              }
         *digitstackptr = -1;
         }
    
    int main(void)
         {
         HANDLE hfile = ::CreateFile(FILENAME, GENERIC_READ, NULL, NULL, OPEN_EXISTING, 
    
    FILE_ATTRIBUTE_NORMAL, NULL);
         if(hfile)
              {
              digitstackptr = digitstack; //digit stack is empty to start
              ::ZeroMemory(sumbuf,256);
              
              size = ::GetFileSize(hfile, NULL);
              while(pos < size)
                   {
                   DWORD readamount = size-pos;
                   if(readamount > 1024)
                        readamount = 1024;
                   if(!::ReadFile(hfile, readbuf, readamount, &readamount, NULL))
                        {
                        std::cout << "File read error" << std::endl;
                        return 0;
                        }
                   else
                        {
                        readendptr = readbuf + readamount;
                        for(readptr = readbuf; readptr < readendptr; readptr++)
                             {
                             if(*readptr > '9' || *readptr < '0')
                                  {
                                  if(digitstackptr != digitstack) //there is something 
    
    in the digitstack
                                       {
                                       ::AddIt();
                                       digitstackptr = digitstack; //make sure digit 
    
    stack is empty
                                       }
                                  }
                             else //is a digit.  Add to digitstack
                                  *(digitstackptr++) = *readptr - '0';
                             }
                        pos += readamount;
                        }               
                   }
              if(digitstackptr != digitstack)
                   ::AddIt();
              ::DivideIt();
              for(digitstackptr = digitstack; *digitstackptr != -1; digitstackptr++)
                   {
                   std::cout << (char)(*digitstackptr + '0');
                   }
              std::cout << std::endl;
              ::CloseHandle(hfile);
              }
         else
              std::cout << "Could not open file" << std::endl;
         return 0;
         }
    My best code is written with the delete key.

  4. #4
    Code Goddess Prelude's Avatar
    Join Date
    Sep 2001
    Posts
    9,897
    ygfperson's entry:
    Code:
    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    //#define MAX_BUFFER 1024*1024*8
    #ifdef PROFILER
    #include <time.h>
    #endif
    //#include <iostream>
    int main() {
    #ifdef PROFILER
      clock_t start_time, middle, end, middle_two;
    #endif
      char *input_buffer, *start;
      int non = 0, count = 0, MAX_BUFFER;
      double total;
      int placement[9] = {0,0,0,0,0,0,0,0,0}, *place;
      FILE* input;
      union pointers {
        int* i;
        char* p;
      } p_t;
    #define pointer_i (p_t.i)
    #define pointer (p_t.p)
      place = placement;
    #ifdef PROFILER
      start_time = clock();
    #endif
      input = fopen("numbers.txt", "ra");
      if (input == NULL) {
        printf("Invalid file\n");
        fflush(stdout);
        return 1;
      }
      fseek(input,0,SEEK_END);
      MAX_BUFFER = (ftell(input) & ~0x3) + 4; //round up to nearest 4
      fseek(input,0,SEEK_SET);
    #ifdef PROFILER
      middle_two = clock();
    #endif
    
      input_buffer = (char*)malloc(MAX_BUFFER * sizeof(char));
      start = pointer = input_buffer;
      ++start;
    
      pointer += MAX_BUFFER;
      //fgets(start,MAX_BUFFER - 1,input);
      fread(start,sizeof(int),MAX_BUFFER >> 2, input);
    #ifdef PROFILER
      middle = clock();
    #endif
      while (!*pointer)
        --pointer;
      
      for (;*pointer;) {
        while (!(*pointer & 0x10))
          --pointer;
    
        while (*pointer & 0x10)   //this assumes only numbers and whitespace
          *place++ += *pointer-- & 0xF;
        place = placement;
        ++count;
       
      }
      total = placement[0] + placement[1]*10 + placement[2]*100 + placement[3]*1000 + placement[4]*10000 + placement[5]*100000 + placement[6]*1000000 + placement[7]*10000000 + placement[8]*100000000;
      total /= count;
    #ifdef PROFILER
      end = clock();
    #endif
      printf("%f\n",total);
    #ifdef PROFILER
      fprintf(stderr,"The interval was: %f seconds, or %f seconds between middle and beginning\nand %f seconds between middle_two and beginning\n",(double)(end-start_time)/(double)CLOCKS_PER_SEC, (double)(middle-start_time)/(double)CLOCKS_PER_SEC, (double)(middle_two-start_time)/(double)CLOCKS_PER_SEC);
    #endif
      fflush(stdout);
      free(input_buffer);
      return 0;
    }
    My best code is written with the delete key.

  5. #5
    Code Goddess Prelude's Avatar
    Join Date
    Sep 2001
    Posts
    9,897
    Speedy5's entry:
    Code:
    // Speedy -- August 16, 2003
    // Contest Entry for ADC #3
    
    // This uses asyncronous reading: When the program is processing the current
    // buffer, the system is reading the next buffer. Then it swaps buffers and repeats.
    // The large multable is done so that numbers under four digits can be looked
    // up in the table, increasing speed. It saves a slow integer multiplication of
    // ten and a substraction of the ASCII space character.
    
    // This was compiled on Microsoft Visual C++.NET 2002 as unmanaged (normal) C++
    // code. The operating system was Windows 2000. This will probably not run on
    // Windows 95, 98, ME and maybe not NT. It should definatly run on Windows XP.
    
    // On my Pentium II 366 MHz, 5400 RPM IBM laptop, it processed the average of
    // a 2.755 MB file (100,000 numbers) in less than a third of a second.
    
    // Have fun!  :)
    #include <windows.h>
    #include <stdio.h>
    
    const int multable[] = {
    	-48, -38, -28, -18, -8, 2, 12, 22, 32, 42,
    	52, 62, 72, 82, 92, 102, 112, 122, 132, 142,
    	152, 162, 172, 182, 192, 202, 212, 222, 232, 242,
    	252, 262, 272, 282, 292, 302, 312, 322, 332, 342,
    	352, 362, 372, 382, 392, 402, 412, 422, 432, 442,
    	452, 462, 472, 482, 492, 502, 512, 522, 532, 542,
    	552, 562, 572, 582, 592, 602, 612, 622, 632, 642,
    	652, 662, 672, 682, 692, 702, 712, 722, 732, 742,
    	752, 762, 772, 782, 792, 802, 812, 822, 832, 842,
    	852, 862, 872, 882, 892, 902, 912, 922, 932, 942,
    	952, 962, 972, 982, 992, 1002, 1012, 1022, 1032, 1042,
    	1052, 1062, 1072, 1082, 1092, 1102, 1112, 1122, 1132, 1142,
    	1152, 1162, 1172, 1182, 1192, 1202, 1212, 1222, 1232, 1242,
    	1252, 1262, 1272, 1282, 1292, 1302, 1312, 1322, 1332, 1342,
    	1352, 1362, 1372, 1382, 1392, 1402, 1412, 1422, 1432, 1442,
    	1452, 1462, 1472, 1482, 1492, 1502, 1512, 1522, 1532, 1542,
    	1552, 1562, 1572, 1582, 1592, 1602, 1612, 1622, 1632, 1642,
    	1652, 1662, 1672, 1682, 1692, 1702, 1712, 1722, 1732, 1742,
    	1752, 1762, 1772, 1782, 1792, 1802, 1812, 1822, 1832, 1842,
    	1852, 1862, 1872, 1882, 1892, 1902, 1912, 1922, 1932, 1942,
    	1952, 1962, 1972, 1982, 1992, 2002, 2012, 2022, 2032, 2042,
    	2052, 2062, 2072, 2082, 2092, 2102, 2112, 2122, 2132, 2142,
    	2152, 2162, 2172, 2182, 2192, 2202, 2212, 2222, 2232, 2242,
    	2252, 2262, 2272, 2282, 2292, 2302, 2312, 2322, 2332, 2342,
    	2352, 2362, 2372, 2382, 2392, 2402, 2412, 2422, 2432, 2442,
    	2452, 2462, 2472, 2482, 2492, 2502, 2512, 2522, 2532, 2542,
    	2552, 2562, 2572, 2582, 2592, 2602, 2612, 2622, 2632, 2642,
    	2652, 2662, 2672, 2682, 2692, 2702, 2712, 2722, 2732, 2742,
    	2752, 2762, 2772, 2782, 2792, 2802, 2812, 2822, 2832, 2842,
    	2852, 2862, 2872, 2882, 2892, 2902, 2912, 2922, 2932, 2942,
    	2952, 2962, 2972, 2982, 2992, 3002, 3012, 3022, 3032, 3042,
    	3052, 3062, 3072, 3082, 3092, 3102, 3112, 3122, 3132, 3142,
    	3152, 3162, 3172, 3182, 3192, 3202, 3212, 3222, 3232, 3242,
    	3252, 3262, 3272, 3282, 3292, 3302, 3312, 3322, 3332, 3342,
    	3352, 3362, 3372, 3382, 3392, 3402, 3412, 3422, 3432, 3442,
    	3452, 3462, 3472, 3482, 3492, 3502, 3512, 3522, 3532, 3542,
    	3552, 3562, 3572, 3582, 3592, 3602, 3612, 3622, 3632, 3642,
    	3652, 3662, 3672, 3682, 3692, 3702, 3712, 3722, 3732, 3742,
    	3752, 3762, 3772, 3782, 3792, 3802, 3812, 3822, 3832, 3842,
    	3852, 3862, 3872, 3882, 3892, 3902, 3912, 3922, 3932, 3942,
    	3952, 3962, 3972, 3982, 3992, 4002, 4012, 4022, 4032, 4042,
    	4052, 4062, 4072, 4082, 4092, 4102, 4112, 4122, 4132, 4142,
    	4152, 4162, 4172, 4182, 4192, 4202, 4212, 4222, 4232, 4242,
    	4252, 4262, 4272, 4282, 4292, 4302, 4312, 4322, 4332, 4342,
    	4352, 4362, 4372, 4382, 4392, 4402, 4412, 4422, 4432, 4442,
    	4452, 4462, 4472, 4482, 4492, 4502, 4512, 4522, 4532, 4542,
    	4552, 4562, 4572, 4582, 4592, 4602, 4612, 4622, 4632, 4642,
    	4652, 4662, 4672, 4682, 4692, 4702, 4712, 4722, 4732, 4742,
    	4752, 4762, 4772, 4782, 4792, 4802, 4812, 4822, 4832, 4842,
    	4852, 4862, 4872, 4882, 4892, 4902, 4912, 4922, 4932, 4942,
    	4952, 4962, 4972, 4982, 4992, 5002, 5012, 5022, 5032, 5042,
    	5052, 5062, 5072, 5082, 5092, 5102, 5112, 5122, 5132, 5142,
    	5152, 5162, 5172, 5182, 5192, 5202, 5212, 5222, 5232, 5242,
    	5252, 5262, 5272, 5282, 5292, 5302, 5312, 5322, 5332, 5342,
    	5352, 5362, 5372, 5382, 5392, 5402, 5412, 5422, 5432, 5442,
    	5452, 5462, 5472, 5482, 5492, 5502, 5512, 5522, 5532, 5542,
    	5552, 5562, 5572, 5582, 5592, 5602, 5612, 5622, 5632, 5642,
    	5652, 5662, 5672, 5682, 5692, 5702, 5712, 5722, 5732, 5742,
    	5752, 5762, 5772, 5782, 5792, 5802, 5812, 5822, 5832, 5842,
    	5852, 5862, 5872, 5882, 5892, 5902, 5912, 5922, 5932, 5942,
    	5952, 5962, 5972, 5982, 5992, 6002, 6012, 6022, 6032, 6042,
    	6052, 6062, 6072, 6082, 6092, 6102, 6112, 6122, 6132, 6142,
    	6152, 6162, 6172, 6182, 6192, 6202, 6212, 6222, 6232, 6242,
    	6252, 6262, 6272, 6282, 6292, 6302, 6312, 6322, 6332, 6342,
    	6352, 6362, 6372, 6382, 6392, 6402, 6412, 6422, 6432, 6442,
    	6452, 6462, 6472, 6482, 6492, 6502, 6512, 6522, 6532, 6542,
    	6552, 6562, 6572, 6582, 6592, 6602, 6612, 6622, 6632, 6642,
    	6652, 6662, 6672, 6682, 6692, 6702, 6712, 6722, 6732, 6742,
    	6752, 6762, 6772, 6782, 6792, 6802, 6812, 6822, 6832, 6842,
    	6852, 6862, 6872, 6882, 6892, 6902, 6912, 6922, 6932, 6942,
    	6952, 6962, 6972, 6982, 6992, 7002, 7012, 7022, 7032, 7042,
    	7052, 7062, 7072, 7082, 7092, 7102, 7112, 7122, 7132, 7142,
    	7152, 7162, 7172, 7182, 7192, 7202, 7212, 7222, 7232, 7242,
    	7252, 7262, 7272, 7282, 7292, 7302, 7312, 7322, 7332, 7342,
    	7352, 7362, 7372, 7382, 7392, 7402, 7412, 7422, 7432, 7442,
    	7452, 7462, 7472, 7482, 7492, 7502, 7512, 7522, 7532, 7542,
    	7552, 7562, 7572, 7582, 7592, 7602, 7612, 7622, 7632, 7642,
    	7652, 7662, 7672, 7682, 7692, 7702, 7712, 7722, 7732, 7742,
    	7752, 7762, 7772, 7782, 7792, 7802, 7812, 7822, 7832, 7842,
    	7852, 7862, 7872, 7882, 7892, 7902, 7912, 7922, 7932, 7942,
    	7952, 7962, 7972, 7982, 7992, 8002, 8012, 8022, 8032, 8042,
    	8052, 8062, 8072, 8082, 8092, 8102, 8112, 8122, 8132, 8142,
    	8152, 8162, 8172, 8182, 8192, 8202, 8212, 8222, 8232, 8242,
    	8252, 8262, 8272, 8282, 8292, 8302, 8312, 8322, 8332, 8342,
    	8352, 8362, 8372, 8382, 8392, 8402, 8412, 8422, 8432, 8442,
    	8452, 8462, 8472, 8482, 8492, 8502, 8512, 8522, 8532, 8542,
    	8552, 8562, 8572, 8582, 8592, 8602, 8612, 8622, 8632, 8642,
    	8652, 8662, 8672, 8682, 8692, 8702, 8712, 8722, 8732, 8742,
    	8752, 8762, 8772, 8782, 8792, 8802, 8812, 8822, 8832, 8842,
    	8852, 8862, 8872, 8882, 8892, 8902, 8912, 8922, 8932, 8942,
    	8952, 8962, 8972, 8982, 8992, 9002, 9012, 9022, 9032, 9042,
    	9052, 9062, 9072, 9082, 9092, 9102, 9112, 9122, 9132, 9142,
    	9152, 9162, 9172, 9182, 9192, 9202, 9212, 9222, 9232, 9242,
    	9252, 9262, 9272, 9282, 9292, 9302, 9312, 9322, 9332, 9342,
    	9352, 9362, 9372, 9382, 9392, 9402, 9412, 9422, 9432, 9442,
    	9452, 9462, 9472, 9482, 9492, 9502, 9512, 9522, 9532, 9542,
    	9552, 9562, 9572, 9582, 9592, 9602, 9612, 9622, 9632, 9642,
    	9652, 9662, 9672, 9682, 9692, 9702, 9712, 9722, 9732, 9742,
    	9752, 9762, 9772, 9782, 9792, 9802, 9812, 9822, 9832, 9842,
    	9852, 9862, 9872, 9882, 9892, 9902, 9912, 9922, 9932, 9942,
    	9952, 9962, 9972, 9982, 9992, 10002, 10012, 10022, 10032, 10042,
    	10052, 10062, 10072, 10082, 10092, 10102, 10112, 10122, 10132, 10142,
    	10152, 10162, 10172, 10182, 10192, 10202, 10212, 10222, 10232, 10242,
    	10252, 10262, 10272, 10282, 10292, 10302, 10312, 10322, 10332, 10342,
    	10352, 10362, 10372, 10382, 10392, 10402, 10412, 10422, 10432, 10442,
    	10452, 10462, 10472, 10482, 10492, 10502, 10512, 10522, 10532, 10542,
    	10552, 10562, 10572, 10582, 10592, 10602, 10612, 10622, 10632, 10642,
    	10652, 10662, 10672, 10682, 10692, 10702, 10712, 10722, 10732, 10742,
    	10752, 10762, 10772, 10782, 10792, 10802, 10812, 10822, 10832, 10842,
    	10852, 10862, 10872, 10882, 10892, 10902, 10912, 10922, 10932, 10942,
    	10952, 10962, 10972, 10982, 10992, 11002, 11012, 11022, 11032, 11042,
    	11052, 11062, 11072, 11082, 11092, 11102, 11112, 11122, 11132, 11142,
    	11152, 11162, 11172, 11182, 11192, 11202, 11212, 11222, 11232, 11242,
    	11252, 11262, 11272, 11282, 11292, 11302, 11312, 11322, 11332, 11342,
    	11352, 11362, 11372, 11382, 11392, 11402, 11412, 11422, 11432, 11442,
    	11452, 11462, 11472, 11482, 11492, 11502, 11512, 11522, 11532, 11542,
    	11552, 11562, 11572, 11582, 11592, 11602, 11612, 11622, 11632, 11642,
    	11652, 11662, 11672, 11682, 11692, 11702, 11712, 11722, 11732, 11742,
    	11752, 11762, 11772, 11782, 11792, 11802, 11812, 11822, 11832, 11842,
    	11852, 11862, 11872, 11882, 11892, 11902, 11912, 11922, 11932, 11942,
    	11952, 11962, 11972, 11982, 11992, 12002, 12012, 12022, 12032, 12042,
    	12052, 12062, 12072, 12082, 12092, 12102, 12112, 12122, 12132, 12142,
    	12152, 12162, 12172, 12182, 12192, 12202, 12212, 12222, 12232, 12242,
    	12252, 12262, 12272, 12282, 12292, 12302, 12312, 12322, 12332, 12342,
    	12352, 12362, 12372, 12382, 12392, 12402, 12412, 12422, 12432, 12442,
    	12452, 12462, 12472, 12482, 12492, 12502, 12512, 12522, 12532, 12542,
    	12552, 12562, 12572, 12582, 12592, 12602, 12612, 12622, 12632, 12642,
    	12652, 12662, 12672, 12682, 12692, 12702, 12712, 12722, 12732, 12742,
    	12752, 12762, 12772, 12782, 12792, 12802, 12812, 12822, 12832, 12842,
    	12852, 12862, 12872, 12882, 12892, 12902, 12912, 12922, 12932, 12942,
    	12952, 12962, 12972, 12982, 12992, 13002, 13012, 13022, 13032, 13042,
    	13052, 13062, 13072, 13082, 13092, 13102, 13112, 13122, 13132, 13142,
    	13152, 13162, 13172, 13182, 13192, 13202, 13212, 13222, 13232, 13242,
    	13252, 13262, 13272, 13282, 13292, 13302, 13312, 13322, 13332, 13342,
    	13352, 13362, 13372, 13382, 13392, 13402, 13412, 13422, 13432, 13442,
    	13452, 13462, 13472, 13482, 13492, 13502, 13512, 13522, 13532, 13542,
    	13552, 13562, 13572, 13582, 13592, 13602, 13612, 13622, 13632, 13642,
    	13652, 13662, 13672, 13682, 13692, 13702, 13712, 13722, 13732, 13742,
    	13752, 13762, 13772, 13782, 13792, 13802, 13812, 13822, 13832, 13842,
    	13852, 13862, 13872, 13882, 13892, 13902, 13912, 13922, 13932, 13942,
    	13952, 13962, 13972, 13982, 13992, 14002, 14012, 14022, 14032, 14042,
    	14052, 14062, 14072, 14082, 14092, 14102, 14112, 14122, 14132, 14142,
    	14152, 14162, 14172, 14182, 14192, 14202, 14212, 14222, 14232, 14242,
    	14252, 14262, 14272, 14282, 14292, 14302, 14312, 14322, 14332, 14342,
    	14352, 14362, 14372, 14382, 14392, 14402, 14412, 14422, 14432, 14442,
    	14452, 14462, 14472, 14482, 14492, 14502, 14512, 14522, 14532, 14542,
    	14552, 14562, 14572, 14582, 14592, 14602, 14612, 14622, 14632, 14642,
    	14652, 14662, 14672, 14682, 14692, 14702, 14712, 14722, 14732, 14742,
    	14752, 14762, 14772, 14782, 14792, 14802, 14812, 14822, 14832, 14842,
    	14852, 14862, 14872, 14882, 14892, 14902, 14912, 14922, 14932, 14942,
    	14952, 14962, 14972, 14982, 14992, 15002, 15012, 15022, 15032, 15042,
    	15052, 15062, 15072, 15082, 15092, 15102, 15112, 15122, 15132, 15142,
    	15152, 15162, 15172, 15182, 15192, 15202, 15212, 15222, 15232, 15242,
    	15252, 15262, 15272, 15282, 15292, 15302, 15312, 15322, 15332, 15342,
    	15352, 15362, 15372, 15382, 15392, 15402, 15412, 15422, 15432, 15442,
    	15452, 15462, 15472, 15482, 15492, 15502, 15512, 15522, 15532, 15542,
    	15552, 15562, 15572, 15582, 15592, 15602, 15612, 15622, 15632, 15642,
    	15652, 15662, 15672, 15682, 15692, 15702, 15712, 15722, 15732, 15742,
    	15752, 15762, 15772, 15782, 15792, 15802, 15812, 15822, 15832, 15842,
    	15852, 15862, 15872, 15882, 15892, 15902, 15912, 15922, 15932, 15942,
    	15952, 15962, 15972, 15982, 15992, 16002, 16012, 16022, 16032, 16042,
    	16052, 16062, 16072, 16082, 16092, 16102, 16112, 16122, 16132, 16142,
    	16152, 16162, 16172, 16182, 16192, 16202, 16212, 16222, 16232, 16242,
    	16252, 16262, 16272, 16282, 16292, 16302, 16312, 16322, 16332, 16342,
    	16352, 16362, 16372, 16382, 16392, 16402, 16412, 16422, 16432, 16442,
    	16452, 16462, 16472, 16482, 16492, 16502, 16512, 16522, 16532, 16542,
    	16552, 16562, 16572, 16582, 16592, 16602, 16612, 16622, 16632, 16642,
    	16652, 16662, 16672, 16682, 16692, 16702, 16712, 16722, 16732, 16742,
    	16752, 16762, 16772, 16782, 16792, 16802, 16812, 16822, 16832, 16842,
    	16852, 16862, 16872, 16882, 16892, 16902, 16912, 16922, 16932, 16942,
    	16952, 16962, 16972, 16982, 16992, 17002, 17012, 17022, 17032, 17042,
    	17052, 17062, 17072, 17082, 17092, 17102, 17112, 17122, 17132, 17142,
    	17152, 17162, 17172, 17182, 17192, 17202, 17212, 17222, 17232, 17242,
    	17252, 17262, 17272, 17282, 17292, 17302, 17312, 17322, 17332, 17342,
    	17352, 17362, 17372, 17382, 17392, 17402, 17412, 17422, 17432, 17442,
    	17452, 17462, 17472, 17482, 17492, 17502, 17512, 17522, 17532, 17542,
    	17552, 17562, 17572, 17582, 17592, 17602, 17612, 17622, 17632, 17642,
    	17652, 17662, 17672, 17682, 17692, 17702, 17712, 17722, 17732, 17742,
    	17752, 17762, 17772, 17782, 17792, 17802, 17812, 17822, 17832, 17842,
    	17852, 17862, 17872, 17882, 17892, 17902, 17912, 17922, 17932, 17942,
    	17952, 17962, 17972, 17982, 17992, 18002, 18012, 18022, 18032, 18042,
    	18052, 18062, 18072, 18082, 18092, 18102, 18112, 18122, 18132, 18142,
    	18152, 18162, 18172, 18182, 18192, 18202, 18212, 18222, 18232, 18242,
    	18252, 18262, 18272, 18282, 18292, 18302, 18312, 18322, 18332, 18342,
    	18352, 18362, 18372, 18382, 18392, 18402, 18412, 18422, 18432, 18442,
    	18452, 18462, 18472, 18482, 18492, 18502, 18512, 18522, 18532, 18542,
    	18552, 18562, 18572, 18582, 18592, 18602, 18612, 18622, 18632, 18642,
    	18652, 18662, 18672, 18682, 18692, 18702, 18712, 18722, 18732, 18742,
    	18752, 18762, 18772, 18782, 18792, 18802, 18812, 18822, 18832, 18842,
    	18852, 18862, 18872, 18882, 18892, 18902, 18912, 18922, 18932, 18942,
    	18952, 18962, 18972, 18982, 18992, 19002, 19012, 19022, 19032, 19042,
    	19052, 19062, 19072, 19082, 19092, 19102, 19112, 19122, 19132, 19142,
    	19152, 19162, 19172, 19182, 19192, 19202, 19212, 19222, 19232, 19242,
    	19252, 19262, 19272, 19282, 19292, 19302, 19312, 19322, 19332, 19342,
    	19352, 19362, 19372, 19382, 19392, 19402, 19412, 19422, 19432, 19442,
    	19452, 19462, 19472, 19482, 19492, 19502, 19512, 19522, 19532, 19542,
    	19552, 19562, 19572, 19582, 19592, 19602, 19612, 19622, 19632, 19642,
    	19652, 19662, 19672, 19682, 19692, 19702, 19712, 19722, 19732, 19742,
    	19752, 19762, 19772, 19782, 19792, 19802, 19812, 19822, 19832, 19842,
    	19852, 19862, 19872, 19882, 19892, 19902, 19912, 19922, 19932, 19942,
    	19952, 19962, 19972, 19982, 19992, 20002, 20012, 20022, 20032, 20042,
    	20052, 20062, 20072, 20082, 20092, 20102, 20112, 20122, 20132, 20142,
    	20152, 20162, 20172, 20182, 20192, 20202, 20212, 20222, 20232, 20242,
    	20252, 20262, 20272, 20282, 20292, 20302, 20312, 20322, 20332, 20342,
    	20352, 20362, 20372, 20382, 20392, 20402, 20412, 20422, 20432, 20442,
    	20452, 20462, 20472, 20482, 20492, 20502, 20512, 20522, 20532, 20542,
    	20552, 20562, 20572, 20582, 20592, 20602, 20612, 20622, 20632, 20642,
    	20652, 20662, 20672, 20682, 20692, 20702, 20712, 20722, 20732, 20742,
    	20752, 20762, 20772, 20782, 20792, 20802, 20812, 20822, 20832, 20842,
    	20852, 20862, 20872, 20882, 20892, 20902, 20912, 20922, 20932, 20942,
    	20952, 20962, 20972, 20982, 20992, 21002, 21012, 21022, 21032, 21042,
    	21052, 21062, 21072, 21082, 21092, 21102, 21112, 21122, 21132, 21142,
    	21152, 21162, 21172, 21182, 21192, 21202, 21212, 21222, 21232, 21242,
    	21252, 21262, 21272, 21282, 21292, 21302, 21312, 21322, 21332, 21342,
    	21352, 21362, 21372, 21382, 21392, 21402, 21412, 21422, 21432, 21442,
    	21452, 21462, 21472, 21482, 21492, 21502, 21512, 21522, 21532, 21542,
    	21552, 21562, 21572, 21582, 21592, 21602, 21612, 21622, 21632, 21642,
    	21652, 21662, 21672, 21682, 21692, 21702, 21712, 21722, 21732, 21742,
    	21752, 21762, 21772, 21782, 21792, 21802, 21812, 21822, 21832, 21842,
    	21852, 21862, 21872, 21882, 21892, 21902, 21912, 21922, 21932, 21942,
    	21952, 21962, 21972, 21982, 21992, 22002, 22012, 22022, 22032, 22042,
    	22052, 22062, 22072, 22082, 22092, 22102, 22112, 22122, 22132, 22142,
    	22152, 22162, 22172, 22182, 22192, 22202, 22212, 22222, 22232, 22242,
    	22252, 22262, 22272, 22282, 22292, 22302, 22312, 22322, 22332, 22342,
    	22352, 22362, 22372, 22382, 22392, 22402, 22412, 22422, 22432, 22442,
    	22452, 22462, 22472, 22482, 22492, 22502, 22512, 22522, 22532, 22542,
    	22552, 22562, 22572, 22582, 22592, 22602, 22612, 22622, 22632, 22642,
    	22652, 22662, 22672, 22682, 22692, 22702, 22712, 22722, 22732, 22742,
    	22752, 22762, 22772, 22782, 22792, 22802, 22812, 22822, 22832, 22842,
    	22852, 22862, 22872, 22882, 22892, 22902, 22912, 22922, 22932, 22942,
    	22952, 22962, 22972, 22982, 22992, 23002, 23012, 23022, 23032, 23042,
    	23052, 23062, 23072, 23082, 23092, 23102, 23112, 23122, 23132, 23142,
    	23152, 23162, 23172, 23182, 23192, 23202, 23212, 23222, 23232, 23242,
    	23252, 23262, 23272, 23282, 23292, 23302, 23312, 23322, 23332, 23342,
    	23352, 23362, 23372, 23382, 23392, 23402, 23412, 23422, 23432, 23442,
    	23452, 23462, 23472, 23482, 23492, 23502, 23512, 23522, 23532, 23542,
    	23552, 23562, 23572, 23582, 23592, 23602, 23612, 23622, 23632, 23642,
    	23652, 23662, 23672, 23682, 23692, 23702, 23712, 23722, 23732, 23742,
    	23752, 23762, 23772, 23782, 23792, 23802, 23812, 23822, 23832, 23842,
    	23852, 23862, 23872, 23882, 23892, 23902, 23912, 23922, 23932, 23942,
    	23952, 23962, 23972, 23982, 23992, 24002, 24012, 24022, 24032, 24042,
    	24052, 24062, 24072, 24082, 24092, 24102, 24112, 24122, 24132, 24142,
    	24152, 24162, 24172, 24182, 24192, 24202, 24212, 24222, 24232, 24242,
    	24252, 24262, 24272, 24282, 24292, 24302, 24312, 24322, 24332, 24342,
    	24352, 24362, 24372, 24382, 24392, 24402, 24412, 24422, 24432, 24442,
    	24452, 24462, 24472, 24482, 24492, 24502, 24512, 24522, 24532, 24542,
    	24552, 24562, 24572, 24582, 24592, 24602, 24612, 24622, 24632, 24642,
    	24652, 24662, 24672, 24682, 24692, 24702, 24712, 24722, 24732, 24742,
    	24752, 24762, 24772, 24782, 24792, 24802, 24812, 24822, 24832, 24842,
    	24852, 24862, 24872, 24882, 24892, 24902, 24912, 24922, 24932, 24942,
    	24952, 24962, 24972, 24982, 24992, 25002, 25012, 25022, 25032, 25042,
    	25052, 25062, 25072, 25082, 25092, 25102, 25112, 25122, 25132, 25142,
    	25152, 25162, 25172, 25182, 25192, 25202, 25212, 25222, 25232, 25242,
    	25252, 25262, 25272, 25282, 25292, 25302, 25312, 25322, 25332, 25342,
    	25352, 25362, 25372, 25382, 25392, 25402, 25412, 25422, 25432, 25442,
    	25452, 25462, 25472, 25482, 25492, 25502, 25512, 25522, 25532, 25542,
    	25552, 25562, 25572, 25582, 25592, 25602, 25612, 25622, 25632, 25642,
    	25652, 25662, 25672, 25682, 25692, 25702, 25712, 25722, 25732, 25742,
    	25752, 25762, 25772, 25782, 25792, 25802, 25812, 25822, 25832, 25842,
    	25852, 25862, 25872, 25882, 25892, 25902, 25912, 25922, 25932, 25942,
    	25952, 25962, 25972, 25982, 25992, 26002, 26012, 26022, 26032, 26042,
    	26052, 26062, 26072, 26082, 26092, 26102, 26112, 26122, 26132, 26142,
    	26152, 26162, 26172, 26182, 26192, 26202, 26212, 26222, 26232, 26242,
    	26252, 26262, 26272, 26282, 26292, 26302, 26312, 26322, 26332, 26342,
    	26352, 26362, 26372, 26382, 26392, 26402, 26412, 26422, 26432, 26442,
    	26452, 26462, 26472, 26482, 26492, 26502, 26512, 26522, 26532, 26542,
    	26552, 26562, 26572, 26582, 26592, 26602, 26612, 26622, 26632, 26642,
    	26652, 26662, 26672, 26682, 26692, 26702, 26712, 26722, 26732, 26742,
    	26752, 26762, 26772, 26782, 26792, 26802, 26812, 26822, 26832, 26842,
    	26852, 26862, 26872, 26882, 26892, 26902, 26912, 26922, 26932, 26942,
    	26952, 26962, 26972, 26982, 26992, 27002, 27012, 27022, 27032, 27042,
    	27052, 27062, 27072, 27082, 27092, 27102, 27112, 27122, 27132, 27142,
    	27152, 27162, 27172, 27182, 27192, 27202, 27212, 27222, 27232, 27242,
    	27252, 27262, 27272, 27282, 27292, 27302, 27312, 27322, 27332, 27342,
    	27352, 27362, 27372, 27382, 27392, 27402, 27412, 27422, 27432, 27442,
    	27452, 27462, 27472, 27482, 27492, 27502, 27512, 27522, 27532, 27542,
    	27552, 27562, 27572, 27582, 27592, 27602, 27612, 27622, 27632, 27642,
    	27652, 27662, 27672, 27682, 27692, 27702, 27712, 27722, 27732, 27742,
    	27752, 27762, 27772, 27782, 27792, 27802, 27812, 27822, 27832, 27842,
    	27852, 27862, 27872, 27882, 27892, 27902, 27912, 27922, 27932, 27942,
    	27952, 27962, 27972, 27982, 27992, 28002, 28012, 28022, 28032, 28042,
    	28052, 28062, 28072, 28082, 28092, 28102, 28112, 28122, 28132, 28142,
    	28152, 28162, 28172, 28182, 28192, 28202, 28212, 28222, 28232, 28242,
    	28252, 28262, 28272, 28282, 28292, 28302, 28312, 28322, 28332, 28342,
    	28352, 28362, 28372, 28382, 28392, 28402, 28412, 28422, 28432, 28442,
    	28452, 28462, 28472, 28482, 28492, 28502, 28512, 28522, 28532, 28542,
    	28552, 28562, 28572, 28582, 28592, 28602, 28612, 28622, 28632, 28642,
    	28652, 28662, 28672, 28682, 28692, 28702, 28712, 28722, 28732, 28742,
    	28752, 28762, 28772, 28782, 28792, 28802, 28812, 28822, 28832, 28842,
    	28852, 28862, 28872, 28882, 28892, 28902, 28912, 28922, 28932, 28942,
    	28952, 28962, 28972, 28982, 28992, 29002, 29012, 29022, 29032, 29042,
    	29052, 29062, 29072, 29082, 29092, 29102, 29112, 29122, 29132, 29142,
    	29152, 29162, 29172, 29182, 29192, 29202, 29212, 29222, 29232, 29242,
    	29252, 29262, 29272, 29282, 29292, 29302, 29312, 29322, 29332, 29342,
    	29352, 29362, 29372, 29382, 29392, 29402, 29412, 29422, 29432, 29442,
    	29452, 29462, 29472, 29482, 29492, 29502, 29512, 29522, 29532, 29542,
    	29552, 29562, 29572, 29582, 29592, 29602, 29612, 29622, 29632, 29642,
    	29652, 29662, 29672, 29682, 29692, 29702, 29712, 29722, 29732, 29742,
    	29752, 29762, 29772, 29782, 29792, 29802, 29812, 29822, 29832, 29842,
    	29852, 29862, 29872, 29882, 29892, 29902, 29912, 29922, 29932, 29942,
    	29952, 29962, 29972, 29982, 29992, 30002, 30012, 30022, 30032, 30042,
    	30052, 30062, 30072, 30082, 30092, 30102, 30112, 30122, 30132, 30142,
    	30152, 30162, 30172, 30182, 30192, 30202, 30212, 30222, 30232, 30242,
    	30252, 30262, 30272, 30282, 30292, 30302, 30312, 30322, 30332, 30342,
    	30352, 30362, 30372, 30382, 30392, 30402, 30412, 30422, 30432, 30442,
    	30452, 30462, 30472, 30482, 30492, 30502, 30512, 30522, 30532, 30542,
    	30552, 30562, 30572, 30582, 30592, 30602, 30612, 30622, 30632, 30642,
    	30652, 30662, 30672, 30682, 30692, 30702, 30712, 30722, 30732, 30742,
    	30752, 30762, 30772, 30782, 30792, 30802, 30812, 30822, 30832, 30842,
    	30852, 30862, 30872, 30882, 30892, 30902, 30912, 30922, 30932, 30942,
    	30952, 30962, 30972, 30982, 30992, 31002, 31012, 31022, 31032, 31042,
    	31052, 31062, 31072, 31082, 31092, 31102, 31112, 31122, 31132, 31142,
    	31152, 31162, 31172, 31182, 31192, 31202, 31212, 31222, 31232, 31242,
    	31252, 31262, 31272, 31282, 31292, 31302, 31312, 31322, 31332, 31342,
    	31352, 31362, 31372, 31382, 31392, 31402, 31412, 31422, 31432, 31442,
    	31452, 31462, 31472, 31482, 31492, 31502, 31512, 31522, 31532, 31542,
    	31552, 31562, 31572, 31582, 31592, 31602, 31612, 31622, 31632, 31642,
    	31652, 31662, 31672, 31682, 31692, 31702, 31712, 31722, 31732, 31742,
    	31752, 31762, 31772, 31782, 31792, 31802, 31812, 31822, 31832, 31842,
    	31852, 31862, 31872, 31882, 31892, 31902, 31912, 31922, 31932, 31942,
    	31952, 31962, 31972, 31982, 31992, 32002, 32012, 32022, 32032, 32042,
    	32052, 32062, 32072, 32082, 32092, 32102, 32112, 32122, 32132, 32142,
    	32152, 32162, 32172, 32182, 32192, 32202, 32212, 32222, 32232, 32242,
    	32252, 32262, 32272, 32282, 32292, 32302, 32312, 32322, 32332, 32342,
    	32352, 32362, 32372, 32382, 32392, 32402, 32412, 32422, 32432, 32442,
    	32452, 32462, 32472, 32482, 32492, 32502, 32512, 32522, 32532, 32542,
    	32552, 32562, 32572, 32582, 32592, 32602, 32612, 32622, 32632, 32642,
    	32652, 32662, 32672, 32682, 32692, 32702, 32712, 32722, 32732, 32742,
    	32752, 32762, 32772, 32782, 32792, 32802, 32812, 32822, 32832, 32842,
    	32852, 32862, 32872, 32882, 32892, 32902, 32912, 32922, 32932, 32942,
    	32952, 32962, 32972, 32982, 32992, 33002, 33012, 33022, 33032, 33042,
    	33052, 33062, 33072, 33082, 33092, 33102, 33112, 33122, 33132, 33142,
    	33152, 33162, 33172, 33182, 33192, 33202, 33212, 33222, 33232, 33242,
    	33252, 33262, 33272, 33282, 33292, 33302, 33312, 33322, 33332, 33342,
    	33352, 33362, 33372, 33382, 33392, 33402, 33412, 33422, 33432, 33442,
    	33452, 33462, 33472, 33482, 33492, 33502, 33512, 33522, 33532, 33542,
    	33552, 33562, 33572, 33582, 33592, 33602, 33612, 33622, 33632, 33642,
    	33652, 33662, 33672, 33682, 33692, 33702, 33712, 33722, 33732, 33742,
    	33752, 33762, 33772, 33782, 33792, 33802, 33812, 33822, 33832, 33842,
    	33852, 33862, 33872, 33882, 33892, 33902, 33912, 33922, 33932, 33942,
    	33952, 33962, 33972, 33982, 33992, 34002, 34012, 34022, 34032, 34042,
    	34052, 34062, 34072, 34082, 34092, 34102, 34112, 34122, 34132, 34142,
    	34152, 34162, 34172, 34182, 34192, 34202, 34212, 34222, 34232, 34242,
    	34252, 34262, 34272, 34282, 34292, 34302, 34312, 34322, 34332, 34342,
    	34352, 34362, 34372, 34382, 34392, 34402, 34412, 34422, 34432, 34442,
    	34452, 34462, 34472, 34482, 34492, 34502, 34512, 34522, 34532, 34542,
    	34552, 34562, 34572, 34582, 34592, 34602, 34612, 34622, 34632, 34642,
    	34652, 34662, 34672, 34682, 34692, 34702, 34712, 34722, 34732, 34742,
    	34752, 34762, 34772, 34782, 34792, 34802, 34812, 34822, 34832, 34842,
    	34852, 34862, 34872, 34882, 34892, 34902, 34912, 34922, 34932, 34942,
    	34952, 34962, 34972, 34982, 34992, 35002, 35012, 35022, 35032, 35042,
    	35052, 35062, 35072, 35082, 35092, 35102, 35112, 35122, 35132, 35142,
    	35152, 35162, 35172, 35182, 35192, 35202, 35212, 35222, 35232, 35242,
    	35252, 35262, 35272, 35282, 35292, 35302, 35312, 35322, 35332, 35342,
    	35352, 35362, 35372, 35382, 35392, 35402, 35412, 35422, 35432, 35442,
    	35452, 35462, 35472, 35482, 35492, 35502, 35512, 35522, 35532, 35542,
    	35552, 35562, 35572, 35582, 35592, 35602, 35612, 35622, 35632, 35642,
    	35652, 35662, 35672, 35682, 35692, 35702, 35712, 35722, 35732, 35742,
    	35752, 35762, 35772, 35782, 35792, 35802, 35812, 35822, 35832, 35842,
    	35852, 35862, 35872, 35882, 35892, 35902, 35912, 35922, 35932, 35942,
    	35952, 35962, 35972, 35982, 35992, 36002, 36012, 36022, 36032, 36042,
    	36052, 36062, 36072, 36082, 36092, 36102, 36112, 36122, 36132, 36142,
    	36152, 36162, 36172, 36182, 36192, 36202, 36212, 36222, 36232, 36242,
    	36252, 36262, 36272, 36282, 36292, 36302, 36312, 36322, 36332, 36342,
    	36352, 36362, 36372, 36382, 36392, 36402, 36412, 36422, 36432, 36442,
    	36452, 36462, 36472, 36482, 36492, 36502, 36512, 36522, 36532, 36542,
    	36552, 36562, 36572, 36582, 36592, 36602, 36612, 36622, 36632, 36642,
    	36652, 36662, 36672, 36682, 36692, 36702, 36712, 36722, 36732, 36742,
    	36752, 36762, 36772, 36782, 36792, 36802, 36812, 36822, 36832, 36842,
    	36852, 36862, 36872, 36882, 36892, 36902, 36912, 36922, 36932, 36942,
    	36952, 36962, 36972, 36982, 36992, 37002, 37012, 37022, 37032, 37042,
    	37052, 37062, 37072, 37082, 37092, 37102, 37112, 37122, 37132, 37142,
    	37152, 37162, 37172, 37182, 37192, 37202, 37212, 37222, 37232, 37242,
    	37252, 37262, 37272, 37282, 37292, 37302, 37312, 37322, 37332, 37342,
    	37352, 37362, 37372, 37382, 37392, 37402, 37412, 37422, 37432, 37442,
    	37452, 37462, 37472, 37482, 37492, 37502, 37512, 37522, 37532, 37542,
    	37552, 37562, 37572, 37582, 37592, 37602, 37612, 37622, 37632, 37642,
    	37652, 37662, 37672, 37682, 37692, 37702, 37712, 37722, 37732, 37742,
    	37752, 37762, 37772, 37782, 37792, 37802, 37812, 37822, 37832, 37842,
    	37852, 37862, 37872, 37882, 37892, 37902, 37912, 37922, 37932, 37942,
    	37952, 37962, 37972, 37982, 37992, 38002, 38012, 38022, 38032, 38042,
    	38052, 38062, 38072, 38082, 38092, 38102, 38112, 38122, 38132, 38142,
    	38152, 38162, 38172, 38182, 38192, 38202, 38212, 38222, 38232, 38242,
    	38252, 38262, 38272, 38282, 38292, 38302, 38312, 38322, 38332, 38342,
    	38352, 38362, 38372, 38382, 38392, 38402, 38412, 38422, 38432, 38442,
    	38452, 38462, 38472, 38482, 38492, 38502, 38512, 38522, 38532, 38542,
    	38552, 38562, 38572, 38582, 38592, 38602, 38612, 38622, 38632, 38642,
    	38652, 38662, 38672, 38682, 38692, 38702, 38712, 38722, 38732, 38742,
    	38752, 38762, 38772, 38782, 38792, 38802, 38812, 38822, 38832, 38842,
    	38852, 38862, 38872, 38882, 38892, 38902, 38912, 38922, 38932, 38942,
    	38952, 38962, 38972, 38982, 38992, 39002, 39012, 39022, 39032, 39042,
    	39052, 39062, 39072, 39082, 39092, 39102, 39112, 39122, 39132, 39142,
    	39152, 39162, 39172, 39182, 39192, 39202, 39212, 39222, 39232, 39242,
    	39252, 39262, 39272, 39282, 39292, 39302, 39312, 39322, 39332, 39342,
    	39352, 39362, 39372, 39382, 39392, 39402, 39412, 39422, 39432, 39442,
    	39452, 39462, 39472, 39482, 39492, 39502, 39512, 39522, 39532, 39542,
    	39552, 39562, 39572, 39582, 39592, 39602, 39612, 39622, 39632, 39642,
    	39652, 39662, 39672, 39682, 39692, 39702, 39712, 39722, 39732, 39742,
    	39752, 39762, 39772, 39782, 39792, 39802, 39812, 39822, 39832, 39842,
    	39852, 39862, 39872, 39882, 39892, 39902, 39912, 39922, 39932, 39942,
    	39952, 39962, 39972, 39982, 39992, 40002, 40012, 40022, 40032, 40042,
    	40052, 40062, 40072, 40082, 40092, 40102, 40112, 40122, 40132, 40142,
    	40152, 40162, 40172, 40182, 40192, 40202, 40212, 40222, 40232, 40242,
    	40252, 40262, 40272, 40282, 40292, 40302, 40312, 40322, 40332, 40342,
    	40352, 40362, 40372, 40382, 40392, 40402, 40412, 40422, 40432, 40442,
    	40452, 40462, 40472, 40482, 40492, 40502, 40512, 40522, 40532, 40542,
    	40552, 40562, 40572, 40582, 40592, 40602, 40612, 40622, 40632, 40642,
    	40652, 40662, 40672, 40682, 40692, 40702, 40712, 40722, 40732, 40742,
    	40752, 40762, 40772, 40782, 40792, 40802, 40812, 40822, 40832, 40842,
    	40852, 40862, 40872, 40882, 40892, 40902, 40912, 40922, 40932, 40942,
    	40952, 40962, 40972, 40982, 40992, 41002, 41012, 41022, 41032, 41042,
    	41052, 41062, 41072, 41082, 41092, 41102, 41112, 41122, 41132, 41142,
    	41152, 41162, 41172, 41182, 41192, 41202, 41212, 41222, 41232, 41242,
    	41252, 41262, 41272, 41282, 41292, 41302, 41312, 41322, 41332, 41342,
    	41352, 41362, 41372, 41382, 41392, 41402, 41412, 41422, 41432, 41442,
    	41452, 41462, 41472, 41482, 41492, 41502, 41512, 41522, 41532, 41542,
    	41552, 41562, 41572, 41582, 41592, 41602, 41612, 41622, 41632, 41642,
    	41652, 41662, 41672, 41682, 41692, 41702, 41712, 41722, 41732, 41742,
    	41752, 41762, 41772, 41782, 41792, 41802, 41812, 41822, 41832, 41842,
    	41852, 41862, 41872, 41882, 41892, 41902, 41912, 41922, 41932, 41942,
    	41952, 41962, 41972, 41982, 41992, 42002, 42012, 42022, 42032, 42042,
    	42052, 42062, 42072, 42082, 42092, 42102, 42112, 42122, 42132, 42142,
    	42152, 42162, 42172, 42182, 42192, 42202, 42212, 42222, 42232, 42242,
    	42252, 42262, 42272, 42282, 42292, 42302, 42312, 42322, 42332, 42342,
    	42352, 42362, 42372, 42382, 42392, 42402, 42412, 42422, 42432, 42442,
    	42452, 42462, 42472, 42482, 42492, 42502, 42512, 42522, 42532, 42542,
    	42552, 42562, 42572, 42582, 42592, 42602, 42612, 42622, 42632, 42642,
    	42652, 42662, 42672, 42682, 42692, 42702, 42712, 42722, 42732, 42742,
    	42752, 42762, 42772, 42782, 42792, 42802, 42812, 42822, 42832, 42842,
    	42852, 42862, 42872, 42882, 42892, 42902, 42912, 42922, 42932, 42942,
    	42952, 42962, 42972, 42982, 42992, 43002, 43012, 43022, 43032, 43042,
    	43052, 43062, 43072, 43082, 43092, 43102, 43112, 43122, 43132, 43142,
    	43152, 43162, 43172, 43182, 43192, 43202, 43212, 43222, 43232, 43242,
    	43252, 43262, 43272, 43282, 43292, 43302, 43312, 43322, 43332, 43342,
    	43352, 43362, 43372, 43382, 43392, 43402, 43412, 43422, 43432, 43442,
    	43452, 43462, 43472, 43482, 43492, 43502, 43512, 43522, 43532, 43542,
    	43552, 43562, 43572, 43582, 43592, 43602, 43612, 43622, 43632, 43642,
    	43652, 43662, 43672, 43682, 43692, 43702, 43712, 43722, 43732, 43742,
    	43752, 43762, 43772, 43782, 43792, 43802, 43812, 43822, 43832, 43842,
    	43852, 43862, 43872, 43882, 43892, 43902, 43912, 43922, 43932, 43942,
    	43952, 43962, 43972, 43982, 43992, 44002, 44012, 44022, 44032, 44042,
    	44052, 44062, 44072, 44082, 44092, 44102, 44112, 44122, 44132, 44142,
    	44152, 44162, 44172, 44182, 44192, 44202, 44212, 44222, 44232, 44242,
    	44252, 44262, 44272, 44282, 44292, 44302, 44312, 44322, 44332, 44342,
    	44352, 44362, 44372, 44382, 44392, 44402, 44412, 44422, 44432, 44442,
    	44452, 44462, 44472, 44482, 44492, 44502, 44512, 44522, 44532, 44542,
    	44552, 44562, 44572, 44582, 44592, 44602, 44612, 44622, 44632, 44642,
    	44652, 44662, 44672, 44682, 44692, 44702, 44712, 44722, 44732, 44742,
    	44752, 44762, 44772, 44782, 44792, 44802, 44812, 44822, 44832, 44842,
    	44852, 44862, 44872, 44882, 44892, 44902, 44912, 44922, 44932, 44942,
    	44952, 44962, 44972, 44982, 44992, 45002, 45012, 45022, 45032, 45042,
    	45052, 45062, 45072, 45082, 45092, 45102, 45112, 45122, 45132, 45142,
    	45152, 45162, 45172, 45182, 45192, 45202, 45212, 45222, 45232, 45242,
    	45252, 45262, 45272, 45282, 45292, 45302, 45312, 45322, 45332, 45342,
    	45352, 45362, 45372, 45382, 45392, 45402, 45412, 45422, 45432, 45442,
    	45452, 45462, 45472, 45482, 45492, 45502, 45512, 45522, 45532, 45542,
    	45552, 45562, 45572, 45582, 45592, 45602, 45612, 45622, 45632, 45642,
    	45652, 45662, 45672, 45682, 45692, 45702, 45712, 45722, 45732, 45742,
    	45752, 45762, 45772, 45782, 45792, 45802, 45812, 45822, 45832, 45842,
    	45852, 45862, 45872, 45882, 45892, 45902, 45912, 45922, 45932, 45942,
    	45952, 45962, 45972, 45982, 45992, 46002, 46012, 46022, 46032, 46042,
    	46052, 46062, 46072, 46082, 46092, 46102, 46112, 46122, 46132, 46142,
    	46152, 46162, 46172, 46182, 46192, 46202, 46212, 46222, 46232, 46242,
    	46252, 46262, 46272, 46282, 46292, 46302, 46312, 46322, 46332, 46342,
    	46352, 46362, 46372, 46382, 46392, 46402, 46412, 46422, 46432, 46442,
    	46452, 46462, 46472, 46482, 46492, 46502, 46512, 46522, 46532, 46542,
    	46552, 46562, 46572, 46582, 46592, 46602, 46612, 46622, 46632, 46642,
    	46652, 46662, 46672, 46682, 46692, 46702, 46712, 46722, 46732, 46742,
    	46752, 46762, 46772, 46782, 46792, 46802, 46812, 46822, 46832, 46842,
    	46852, 46862, 46872, 46882, 46892, 46902, 46912, 46922, 46932, 46942,
    	46952, 46962, 46972, 46982, 46992, 47002, 47012, 47022, 47032, 47042,
    	47052, 47062, 47072, 47082, 47092, 47102, 47112, 47122, 47132, 47142,
    	47152, 47162, 47172, 47182, 47192, 47202, 47212, 47222, 47232, 47242,
    	47252, 47262, 47272, 47282, 47292, 47302, 47312, 47322, 47332, 47342,
    	47352, 47362, 47372, 47382, 47392, 47402, 47412, 47422, 47432, 47442,
    	47452, 47462, 47472, 47482, 47492, 47502, 47512, 47522, 47532, 47542,
    	47552, 47562, 47572, 47582, 47592, 47602, 47612, 47622, 47632, 47642,
    	47652, 47662, 47672, 47682, 47692, 47702, 47712, 47722, 47732, 47742,
    	47752, 47762, 47772, 47782, 47792, 47802, 47812, 47822, 47832, 47842,
    	47852, 47862, 47872, 47882, 47892, 47902, 47912, 47922, 47932, 47942,
    	47952, 47962, 47972, 47982, 47992, 48002, 48012, 48022, 48032, 48042,
    	48052, 48062, 48072, 48082, 48092, 48102, 48112, 48122, 48132, 48142,
    	48152, 48162, 48172, 48182, 48192, 48202, 48212, 48222, 48232, 48242,
    	48252, 48262, 48272, 48282, 48292, 48302, 48312, 48322, 48332, 48342,
    	48352, 48362, 48372, 48382, 48392, 48402, 48412, 48422, 48432, 48442,
    	48452, 48462, 48472, 48482, 48492, 48502, 48512, 48522, 48532, 48542,
    	48552, 48562, 48572, 48582, 48592, 48602, 48612, 48622, 48632, 48642,
    	48652, 48662, 48672, 48682, 48692, 48702, 48712, 48722, 48732, 48742,
    	48752, 48762, 48772, 48782, 48792, 48802, 48812, 48822, 48832, 48842,
    	48852, 48862, 48872, 48882, 48892, 48902, 48912, 48922, 48932, 48942,
    	48952, 48962, 48972, 48982, 48992, 49002, 49012, 49022, 49032, 49042,
    	49052, 49062, 49072, 49082, 49092, 49102, 49112, 49122, 49132, 49142,
    	49152, 49162, 49172, 49182, 49192, 49202, 49212, 49222, 49232, 49242,
    	49252, 49262, 49272, 49282, 49292, 49302, 49312, 49322, 49332, 49342,
    	49352, 49362, 49372, 49382, 49392, 49402, 49412, 49422, 49432, 49442,
    	49452, 49462, 49472, 49482, 49492, 49502, 49512, 49522, 49532, 49542,
    	49552, 49562, 49572, 49582, 49592, 49602, 49612, 49622, 49632, 49642,
    	49652, 49662, 49672, 49682, 49692, 49702, 49712, 49722, 49732, 49742,
    	49752, 49762, 49772, 49782, 49792, 49802, 49812, 49822, 49832, 49842,
    	49852, 49862, 49872, 49882, 49892, 49902, 49912, 49922, 49932, 49942,
    	49952, 49962, 49972, 49982, 49992, 50002, 50012, 50022, 50032, 50042,
    	50052, 50062, 50072, 50082, 50092, 50102, 50112, 50122, 50132, 50142,
    	50152, 50162, 50172, 50182, 50192, 50202, 50212, 50222, 50232, 50242,
    	50252, 50262, 50272, 50282, 50292, 50302, 50312, 50322, 50332, 50342,
    	50352, 50362, 50372, 50382, 50392, 50402, 50412, 50422, 50432, 50442,
    	50452, 50462, 50472, 50482, 50492, 50502, 50512, 50522, 50532, 50542,
    	50552, 50562, 50572, 50582, 50592, 50602, 50612, 50622, 50632, 50642,
    	50652, 50662, 50672, 50682, 50692, 50702, 50712, 50722, 50732, 50742,
    	50752, 50762, 50772, 50782, 50792, 50802, 50812, 50822, 50832, 50842,
    	50852, 50862, 50872, 50882, 50892, 50902, 50912, 50922, 50932, 50942,
    	50952, 50962, 50972, 50982, 50992, 51002, 51012, 51022, 51032, 51042,
    	51052, 51062, 51072, 51082, 51092, 51102, 51112, 51122, 51132, 51142,
    	51152, 51162, 51172, 51182, 51192, 51202, 51212, 51222, 51232, 51242,
    	51252, 51262, 51272, 51282, 51292, 51302, 51312, 51322, 51332, 51342,
    	51352, 51362, 51372, 51382, 51392, 51402, 51412, 51422, 51432, 51442,
    	51452, 51462, 51472, 51482, 51492, 51502, 51512, 51522, 51532, 51542,
    	51552, 51562, 51572, 51582, 51592, 51602, 51612, 51622, 51632, 51642,
    	51652, 51662, 51672, 51682, 51692, 51702, 51712, 51722, 51732, 51742,
    	51752, 51762, 51772, 51782, 51792, 51802, 51812, 51822, 51832, 51842,
    	51852, 51862, 51872, 51882, 51892, 51902, 51912, 51922, 51932, 51942,
    	51952, 51962, 51972, 51982, 51992, 52002, 52012, 52022, 52032, 52042,
    	52052, 52062, 52072, 52082, 52092, 52102, 52112, 52122, 52132, 52142,
    	52152, 52162, 52172, 52182, 52192, 52202, 52212, 52222, 52232, 52242,
    	52252, 52262, 52272, 52282, 52292, 52302, 52312, 52322, 52332, 52342,
    	52352, 52362, 52372, 52382, 52392, 52402, 52412, 52422, 52432, 52442,
    	52452, 52462, 52472, 52482, 52492, 52502, 52512, 52522, 52532, 52542,
    	52552, 52562, 52572, 52582, 52592, 52602, 52612, 52622, 52632, 52642,
    	52652, 52662, 52672, 52682, 52692, 52702, 52712, 52722, 52732, 52742,
    	52752, 52762, 52772, 52782, 52792, 52802, 52812, 52822, 52832, 52842,
    	52852, 52862, 52872, 52882, 52892, 52902, 52912, 52922, 52932, 52942,
    	52952, 52962, 52972, 52982, 52992, 53002, 53012, 53022, 53032, 53042,
    	53052, 53062, 53072, 53082, 53092, 53102, 53112, 53122, 53132, 53142,
    	53152, 53162, 53172, 53182, 53192, 53202, 53212, 53222, 53232, 53242,
    	53252, 53262, 53272, 53282, 53292, 53302, 53312, 53322, 53332, 53342,
    	53352, 53362, 53372, 53382, 53392, 53402, 53412, 53422, 53432, 53442,
    	53452, 53462, 53472, 53482, 53492, 53502, 53512, 53522, 53532, 53542,
    	53552, 53562, 53572, 53582, 53592, 53602, 53612, 53622, 53632, 53642,
    	53652, 53662, 53672, 53682, 53692, 53702, 53712, 53722, 53732, 53742,
    	53752, 53762, 53772, 53782, 53792, 53802, 53812, 53822, 53832, 53842,
    	53852, 53862, 53872, 53882, 53892, 53902, 53912, 53922, 53932, 53942,
    	53952, 53962, 53972, 53982, 53992, 54002, 54012, 54022, 54032, 54042,
    	54052, 54062, 54072, 54082, 54092, 54102, 54112, 54122, 54132, 54142,
    	54152, 54162, 54172, 54182, 54192, 54202, 54212, 54222, 54232, 54242,
    	54252, 54262, 54272, 54282, 54292, 54302, 54312, 54322, 54332, 54342,
    	54352, 54362, 54372, 54382, 54392, 54402, 54412, 54422, 54432, 54442,
    	54452, 54462, 54472, 54482, 54492, 54502, 54512, 54522, 54532, 54542,
    	54552, 54562, 54572, 54582, 54592, 54602, 54612, 54622, 54632, 54642,
    	54652, 54662, 54672, 54682, 54692, 54702, 54712, 54722, 54732, 54742,
    	54752, 54762, 54772, 54782, 54792, 54802, 54812, 54822, 54832, 54842,
    	54852, 54862, 54872, 54882, 54892, 54902, 54912, 54922, 54932, 54942,
    	54952, 54962, 54972, 54982, 54992, 55002, 55012, 55022, 55032, 55042,
    	55052, 55062, 55072, 55082, 55092, 55102, 55112, 55122, 55132, 55142,
    	55152, 55162, 55172, 55182, 55192, 55202, 55212, 55222, 55232, 55242,
    	55252, 55262, 55272, 55282, 55292, 55302, 55312, 55322, 55332, 55342,
    	55352, 55362, 55372, 55382, 55392, 55402, 55412, 55422, 55432, 55442,
    	55452, 55462, 55472, 55482, 55492, 55502, 55512, 55522, 55532, 55542,
    	55552, 55562, 55572, 55582, 55592, 55602, 55612, 55622, 55632, 55642,
    	55652, 55662, 55672, 55682, 55692, 55702, 55712, 55722, 55732, 55742,
    	55752, 55762, 55772, 55782, 55792, 55802, 55812, 55822, 55832, 55842,
    	55852, 55862, 55872, 55882, 55892, 55902, 55912, 55922, 55932, 55942,
    	55952, 55962, 55972, 55982, 55992, 56002, 56012, 56022, 56032, 56042,
    	56052, 56062, 56072, 56082, 56092, 56102, 56112, 56122, 56132, 56142,
    	56152, 56162, 56172, 56182, 56192, 56202, 56212, 56222, 56232, 56242,
    	56252, 56262, 56272, 56282, 56292, 56302, 56312, 56322, 56332, 56342,
    	56352, 56362, 56372, 56382, 56392, 56402, 56412, 56422, 56432, 56442,
    	56452, 56462, 56472, 56482, 56492, 56502, 56512, 56522, 56532, 56542,
    	56552, 56562, 56572, 56582, 56592, 56602, 56612, 56622, 56632, 56642,
    	56652, 56662, 56672, 56682, 56692, 56702, 56712, 56722, 56732, 56742,
    	56752, 56762, 56772, 56782, 56792, 56802, 56812, 56822, 56832, 56842,
    	56852, 56862, 56872, 56882, 56892, 56902, 56912, 56922, 56932, 56942,
    	56952, 56962, 56972, 56982, 56992, 57002, 57012, 57022, 57032, 57042,
    	57052, 57062, 57072, 57082, 57092, 57102, 57112, 57122, 57132, 57142,
    	57152, 57162, 57172, 57182, 57192, 57202, 57212, 57222, 57232, 57242,
    	57252, 57262, 57272, 57282, 57292, 57302, 57312, 57322, 57332, 57342,
    	57352, 57362, 57372, 57382, 57392, 57402, 57412, 57422, 57432, 57442,
    	57452, 57462, 57472, 57482, 57492, 57502, 57512, 57522, 57532, 57542,
    	57552, 57562, 57572, 57582, 57592, 57602, 57612, 57622, 57632, 57642,
    	57652, 57662, 57672, 57682, 57692, 57702, 57712, 57722, 57732, 57742,
    	57752, 57762, 57772, 57782, 57792, 57802, 57812, 57822, 57832, 57842,
    	57852, 57862, 57872, 57882, 57892, 57902, 57912, 57922, 57932, 57942,
    	57952, 57962, 57972, 57982, 57992, 58002, 58012, 58022, 58032, 58042,
    	58052, 58062, 58072, 58082, 58092, 58102, 58112, 58122, 58132, 58142,
    	58152, 58162, 58172, 58182, 58192, 58202, 58212, 58222, 58232, 58242,
    	58252, 58262, 58272, 58282, 58292, 58302, 58312, 58322, 58332, 58342,
    	58352, 58362, 58372, 58382, 58392, 58402, 58412, 58422, 58432, 58442,
    	58452, 58462, 58472, 58482, 58492, 58502, 58512, 58522, 58532, 58542,
    	58552, 58562, 58572, 58582, 58592, 58602, 58612, 58622, 58632, 58642,
    	58652, 58662, 58672, 58682, 58692, 58702, 58712, 58722, 58732, 58742,
    	58752, 58762, 58772, 58782, 58792, 58802, 58812, 58822, 58832, 58842,
    	58852, 58862, 58872, 58882, 58892, 58902, 58912, 58922, 58932, 58942,
    	58952, 58962, 58972, 58982, 58992, 59002, 59012, 59022, 59032, 59042,
    	59052, 59062, 59072, 59082, 59092, 59102, 59112, 59122, 59132, 59142,
    	59152, 59162, 59172, 59182, 59192, 59202, 59212, 59222, 59232, 59242,
    	59252, 59262, 59272, 59282, 59292, 59302, 59312, 59322, 59332, 59342,
    	59352, 59362, 59372, 59382, 59392, 59402, 59412, 59422, 59432, 59442,
    	59452, 59462, 59472, 59482, 59492, 59502, 59512, 59522, 59532, 59542,
    	59552, 59562, 59572, 59582, 59592, 59602, 59612, 59622, 59632, 59642,
    	59652, 59662, 59672, 59682, 59692, 59702, 59712, 59722, 59732, 59742,
    	59752, 59762, 59772, 59782, 59792, 59802, 59812, 59822, 59832, 59842,
    	59852, 59862, 59872, 59882, 59892, 59902, 59912, 59922, 59932, 59942,
    	59952, 59962, 59972, 59982, 59992, 60002, 60012, 60022, 60032, 60042,
    	60052, 60062, 60072, 60082, 60092, 60102, 60112, 60122, 60132, 60142,
    	60152, 60162, 60172, 60182, 60192, 60202, 60212, 60222, 60232, 60242,
    	60252, 60262, 60272, 60282, 60292, 60302, 60312, 60322, 60332, 60342,
    	60352, 60362, 60372, 60382, 60392, 60402, 60412, 60422, 60432, 60442,
    	60452, 60462, 60472, 60482, 60492, 60502, 60512, 60522, 60532, 60542,
    	60552, 60562, 60572, 60582, 60592, 60602, 60612, 60622, 60632, 60642,
    	60652, 60662, 60672, 60682, 60692, 60702, 60712, 60722, 60732, 60742,
    	60752, 60762, 60772, 60782, 60792, 60802, 60812, 60822, 60832, 60842,
    	60852, 60862, 60872, 60882, 60892, 60902, 60912, 60922, 60932, 60942,
    	60952, 60962, 60972, 60982, 60992, 61002, 61012, 61022, 61032, 61042,
    	61052, 61062, 61072, 61082, 61092, 61102, 61112, 61122, 61132, 61142,
    	61152, 61162, 61172, 61182, 61192, 61202, 61212, 61222, 61232, 61242,
    	61252, 61262, 61272, 61282, 61292, 61302, 61312, 61322, 61332, 61342,
    	61352, 61362, 61372, 61382, 61392, 61402, 61412, 61422, 61432, 61442,
    	61452, 61462, 61472, 61482, 61492, 61502, 61512, 61522, 61532, 61542,
    	61552, 61562, 61572, 61582, 61592, 61602, 61612, 61622, 61632, 61642,
    	61652, 61662, 61672, 61682, 61692, 61702, 61712, 61722, 61732, 61742,
    	61752, 61762, 61772, 61782, 61792, 61802, 61812, 61822, 61832, 61842,
    	61852, 61862, 61872, 61882, 61892, 61902, 61912, 61922, 61932, 61942,
    	61952, 61962, 61972, 61982, 61992, 62002, 62012, 62022, 62032, 62042,
    	62052, 62062, 62072, 62082, 62092, 62102, 62112, 62122, 62132, 62142,
    	62152, 62162, 62172, 62182, 62192, 62202, 62212, 62222, 62232, 62242,
    	62252, 62262, 62272, 62282, 62292, 62302, 62312, 62322, 62332, 62342,
    	62352, 62362, 62372, 62382, 62392, 62402, 62412, 62422, 62432, 62442,
    	62452, 62462, 62472, 62482, 62492, 62502, 62512, 62522, 62532, 62542,
    	62552, 62562, 62572, 62582, 62592, 62602, 62612, 62622, 62632, 62642,
    	62652, 62662, 62672, 62682, 62692, 62702, 62712, 62722, 62732, 62742,
    	62752, 62762, 62772, 62782, 62792, 62802, 62812, 62822, 62832, 62842,
    	62852, 62862, 62872, 62882, 62892, 62902, 62912, 62922, 62932, 62942,
    	62952, 62962, 62972, 62982, 62992, 63002, 63012, 63022, 63032, 63042,
    	63052, 63062, 63072, 63082, 63092, 63102, 63112, 63122, 63132, 63142,
    	63152, 63162, 63172, 63182, 63192, 63202, 63212, 63222, 63232, 63242,
    	63252, 63262, 63272, 63282, 63292, 63302, 63312, 63322, 63332, 63342,
    	63352, 63362, 63372, 63382, 63392, 63402, 63412, 63422, 63432, 63442,
    	63452, 63462, 63472, 63482, 63492, 63502, 63512, 63522, 63532, 63542,
    	63552, 63562, 63572, 63582, 63592, 63602, 63612, 63622, 63632, 63642,
    	63652, 63662, 63672, 63682, 63692, 63702, 63712, 63722, 63732, 63742,
    	63752, 63762, 63772, 63782, 63792, 63802, 63812, 63822, 63832, 63842,
    	63852, 63862, 63872, 63882, 63892, 63902, 63912, 63922, 63932, 63942,
    	63952, 63962, 63972, 63982, 63992, 64002, 64012, 64022, 64032, 64042,
    	64052, 64062, 64072, 64082, 64092, 64102, 64112, 64122, 64132, 64142,
    	64152, 64162, 64172, 64182, 64192, 64202, 64212, 64222, 64232, 64242,
    	64252, 64262, 64272, 64282, 64292, 64302, 64312, 64322, 64332, 64342,
    	64352, 64362, 64372, 64382, 64392, 64402, 64412, 64422, 64432, 64442,
    	64452, 64462, 64472, 64482, 64492, 64502, 64512, 64522, 64532, 64542,
    	64552, 64562, 64572, 64582, 64592, 64602, 64612, 64622, 64632, 64642,
    	64652, 64662, 64672, 64682, 64692, 64702, 64712, 64722, 64732, 64742,
    	64752, 64762, 64772, 64782, 64792, 64802, 64812, 64822, 64832, 64842,
    	64852, 64862, 64872, 64882, 64892, 64902, 64912, 64922, 64932, 64942,
    	64952, 64962, 64972, 64982, 64992, 65002, 65012, 65022, 65032, 65042,
    	65052, 65062, 65072, 65082, 65092, 65102, 65112, 65122, 65132, 65142,
    	65152, 65162, 65172, 65182, 65192, 65202, 65212, 65222, 65232, 65242,
    	65252, 65262, 65272, 65282, 65292, 65302, 65312, 65322, 65332, 65342,
    	65352, 65362, 65372, 65382, 65392, 65402, 65412, 65422, 65432, 65442,
    	65452, 65462, 65472, 65482, 65492, 65502, 65512, 65522, 65532, 65542,
    	65552, 65562, 65572, 65582, 65592, 65602, 65612, 65622, 65632, 65642,
    	65652, 65662, 65672, 65682, 65692, 65702, 65712, 65722, 65732, 65742,
    	65752, 65762, 65772, 65782, 65792, 65802, 65812, 65822, 65832, 65842,
    	65852, 65862, 65872, 65882, 65892, 65902, 65912, 65922, 65932, 65942,
    	65952, 65962, 65972, 65982, 65992, 66002, 66012, 66022, 66032, 66042,
    	66052, 66062, 66072, 66082, 66092, 66102, 66112, 66122, 66132, 66142,
    	66152, 66162, 66172, 66182, 66192, 66202, 66212, 66222, 66232, 66242,
    	66252, 66262, 66272, 66282, 66292, 66302, 66312, 66322, 66332, 66342,
    	66352, 66362, 66372, 66382, 66392, 66402, 66412, 66422, 66432, 66442,
    	66452, 66462, 66472, 66482, 66492, 66502, 66512, 66522, 66532, 66542,
    	66552, 66562, 66572, 66582, 66592, 66602, 66612, 66622, 66632, 66642,
    	66652, 66662, 66672, 66682, 66692, 66702, 66712, 66722, 66732, 66742,
    	66752, 66762, 66772, 66782, 66792, 66802, 66812, 66822, 66832, 66842,
    	66852, 66862, 66872, 66882, 66892, 66902, 66912, 66922, 66932, 66942,
    	66952, 66962, 66972, 66982, 66992, 67002, 67012, 67022, 67032, 67042,
    	67052, 67062, 67072, 67082, 67092, 67102, 67112, 67122, 67132, 67142,
    	67152, 67162, 67172, 67182, 67192, 67202, 67212, 67222, 67232, 67242,
    	67252, 67262, 67272, 67282, 67292, 67302, 67312, 67322, 67332, 67342,
    	67352, 67362, 67372, 67382, 67392, 67402, 67412, 67422, 67432, 67442,
    	67452, 67462, 67472, 67482, 67492, 67502, 67512, 67522, 67532, 67542,
    	67552, 67562, 67572, 67582, 67592, 67602, 67612, 67622, 67632, 67642,
    	67652, 67662, 67672, 67682, 67692, 67702, 67712, 67722, 67732, 67742,
    	67752, 67762, 67772, 67782, 67792, 67802, 67812, 67822, 67832, 67842,
    	67852, 67862, 67872, 67882, 67892, 67902, 67912, 67922, 67932, 67942,
    	67952, 67962, 67972, 67982, 67992, 68002, 68012, 68022, 68032, 68042,
    	68052, 68062, 68072, 68082, 68092, 68102, 68112, 68122, 68132, 68142,
    	68152, 68162, 68172, 68182, 68192, 68202, 68212, 68222, 68232, 68242,
    	68252, 68262, 68272, 68282, 68292, 68302, 68312, 68322, 68332, 68342,
    	68352, 68362, 68372, 68382, 68392, 68402, 68412, 68422, 68432, 68442,
    	68452, 68462, 68472, 68482, 68492, 68502, 68512, 68522, 68532, 68542,
    	68552, 68562, 68572, 68582, 68592, 68602, 68612, 68622, 68632, 68642,
    	68652, 68662, 68672, 68682, 68692, 68702, 68712, 68722, 68732, 68742,
    	68752, 68762, 68772, 68782, 68792, 68802, 68812, 68822, 68832, 68842,
    	68852, 68862, 68872, 68882, 68892, 68902, 68912, 68922, 68932, 68942,
    	68952, 68962, 68972, 68982, 68992, 69002, 69012, 69022, 69032, 69042,
    	69052, 69062, 69072, 69082, 69092, 69102, 69112, 69122, 69132, 69142,
    	69152, 69162, 69172, 69182, 69192, 69202, 69212, 69222, 69232, 69242,
    	69252, 69262, 69272, 69282, 69292, 69302, 69312, 69322, 69332, 69342,
    	69352, 69362, 69372, 69382, 69392, 69402, 69412, 69422, 69432, 69442,
    	69452, 69462, 69472, 69482, 69492, 69502, 69512, 69522, 69532, 69542,
    	69552, 69562, 69572, 69582, 69592, 69602, 69612, 69622, 69632, 69642,
    	69652, 69662, 69672, 69682, 69692, 69702, 69712, 69722, 69732, 69742,
    	69752, 69762, 69772, 69782, 69792, 69802, 69812, 69822, 69832, 69842,
    	69852, 69862, 69872, 69882, 69892, 69902, 69912, 69922, 69932, 69942,
    	69952, 69962, 69972, 69982, 69992, 70002, 70012, 70022, 70032, 70042,
    	70052, 70062, 70072, 70082, 70092, 70102, 70112, 70122, 70132, 70142,
    	70152, 70162, 70172, 70182, 70192, 70202, 70212, 70222, 70232, 70242,
    	70252, 70262, 70272, 70282, 70292, 70302, 70312, 70322, 70332, 70342,
    	70352, 70362, 70372, 70382, 70392, 70402, 70412, 70422, 70432, 70442,
    	70452, 70462, 70472, 70482, 70492, 70502, 70512, 70522, 70532, 70542,
    	70552, 70562, 70572, 70582, 70592, 70602, 70612, 70622, 70632, 70642,
    	70652, 70662, 70672, 70682, 70692, 70702, 70712, 70722, 70732, 70742,
    	70752, 70762, 70772, 70782, 70792, 70802, 70812, 70822, 70832, 70842,
    	70852, 70862, 70872, 70882, 70892, 70902, 70912, 70922, 70932, 70942,
    	70952, 70962, 70972, 70982, 70992, 71002, 71012, 71022, 71032, 71042,
    	71052, 71062, 71072, 71082, 71092, 71102, 71112, 71122, 71132, 71142,
    	71152, 71162, 71172, 71182, 71192, 71202, 71212, 71222, 71232, 71242,
    	71252, 71262, 71272, 71282, 71292, 71302, 71312, 71322, 71332, 71342,
    	71352, 71362, 71372, 71382, 71392, 71402, 71412, 71422, 71432, 71442,
    	71452, 71462, 71472, 71482, 71492, 71502, 71512, 71522, 71532, 71542,
    	71552, 71562, 71572, 71582, 71592, 71602, 71612, 71622, 71632, 71642,
    	71652, 71662, 71672, 71682, 71692, 71702, 71712, 71722, 71732, 71742,
    	71752, 71762, 71772, 71782, 71792, 71802, 71812, 71822, 71832, 71842,
    	71852, 71862, 71872, 71882, 71892, 71902, 71912, 71922, 71932, 71942,
    	71952, 71962, 71972, 71982, 71992, 72002, 72012, 72022, 72032, 72042,
    	72052, 72062, 72072, 72082, 72092, 72102, 72112, 72122, 72132, 72142,
    	72152, 72162, 72172, 72182, 72192, 72202, 72212, 72222, 72232, 72242,
    	72252, 72262, 72272, 72282, 72292, 72302, 72312, 72322, 72332, 72342,
    	72352, 72362, 72372, 72382, 72392, 72402, 72412, 72422, 72432, 72442,
    	72452, 72462, 72472, 72482, 72492, 72502, 72512, 72522, 72532, 72542,
    	72552, 72562, 72572, 72582, 72592, 72602, 72612, 72622, 72632, 72642,
    	72652, 72662, 72672, 72682, 72692, 72702, 72712, 72722, 72732, 72742,
    	72752, 72762, 72772, 72782, 72792, 72802, 72812, 72822, 72832, 72842,
    	72852, 72862, 72872, 72882, 72892, 72902, 72912, 72922, 72932, 72942,
    	72952, 72962, 72972, 72982, 72992, 73002, 73012, 73022, 73032, 73042,
    	73052, 73062, 73072, 73082, 73092, 73102, 73112, 73122, 73132, 73142,
    	73152, 73162, 73172, 73182, 73192, 73202, 73212, 73222, 73232, 73242,
    	73252, 73262, 73272, 73282, 73292, 73302, 73312, 73322, 73332, 73342,
    	73352, 73362, 73372, 73382, 73392, 73402, 73412, 73422, 73432, 73442,
    	73452, 73462, 73472, 73482, 73492, 73502, 73512, 73522, 73532, 73542,
    	73552, 73562, 73572, 73582, 73592, 73602, 73612, 73622, 73632, 73642,
    	73652, 73662, 73672, 73682, 73692, 73702, 73712, 73722, 73732, 73742,
    	73752, 73762, 73772, 73782, 73792, 73802, 73812, 73822, 73832, 73842,
    	73852, 73862, 73872, 73882, 73892, 73902, 73912, 73922, 73932, 73942,
    	73952, 73962, 73972, 73982, 73992, 74002, 74012, 74022, 74032, 74042,
    	74052, 74062, 74072, 74082, 74092, 74102, 74112, 74122, 74132, 74142,
    	74152, 74162, 74172, 74182, 74192, 74202, 74212, 74222, 74232, 74242,
    	74252, 74262, 74272, 74282, 74292, 74302, 74312, 74322, 74332, 74342,
    	74352, 74362, 74372, 74382, 74392, 74402, 74412, 74422, 74432, 74442,
    	74452, 74462, 74472, 74482, 74492, 74502, 74512, 74522, 74532, 74542,
    	74552, 74562, 74572, 74582, 74592, 74602, 74612, 74622, 74632, 74642,
    	74652, 74662, 74672, 74682, 74692, 74702, 74712, 74722, 74732, 74742,
    	74752, 74762, 74772, 74782, 74792, 74802, 74812, 74822, 74832, 74842,
    	74852, 74862, 74872, 74882, 74892, 74902, 74912, 74922, 74932, 74942,
    	74952, 74962, 74972, 74982, 74992, 75002, 75012, 75022, 75032, 75042,
    	75052, 75062, 75072, 75082, 75092, 75102, 75112, 75122, 75132, 75142,
    	75152, 75162, 75172, 75182, 75192, 75202, 75212, 75222, 75232, 75242,
    	75252, 75262, 75272, 75282, 75292, 75302, 75312, 75322, 75332, 75342,
    	75352, 75362, 75372, 75382, 75392, 75402, 75412, 75422, 75432, 75442,
    	75452, 75462, 75472, 75482, 75492, 75502, 75512, 75522, 75532, 75542,
    	75552, 75562, 75572, 75582, 75592, 75602, 75612, 75622, 75632, 75642,
    	75652, 75662, 75672, 75682, 75692, 75702, 75712, 75722, 75732, 75742,
    	75752, 75762, 75772, 75782, 75792, 75802, 75812, 75822, 75832, 75842,
    	75852, 75862, 75872, 75882, 75892, 75902, 75912, 75922, 75932, 75942,
    	75952, 75962, 75972, 75982, 75992, 76002, 76012, 76022, 76032, 76042,
    	76052, 76062, 76072, 76082, 76092, 76102, 76112, 76122, 76132, 76142,
    	76152, 76162, 76172, 76182, 76192, 76202, 76212, 76222, 76232, 76242,
    	76252, 76262, 76272, 76282, 76292, 76302, 76312, 76322, 76332, 76342,
    	76352, 76362, 76372, 76382, 76392, 76402, 76412, 76422, 76432, 76442,
    	76452, 76462, 76472, 76482, 76492, 76502, 76512, 76522, 76532, 76542,
    	76552, 76562, 76572, 76582, 76592, 76602, 76612, 76622, 76632, 76642,
    	76652, 76662, 76672, 76682, 76692, 76702, 76712, 76722, 76732, 76742,
    	76752, 76762, 76772, 76782, 76792, 76802, 76812, 76822, 76832, 76842,
    	76852, 76862, 76872, 76882, 76892, 76902, 76912, 76922, 76932, 76942,
    	76952, 76962, 76972, 76982, 76992, 77002, 77012, 77022, 77032, 77042,
    	77052, 77062, 77072, 77082, 77092, 77102, 77112, 77122, 77132, 77142,
    	77152, 77162, 77172, 77182, 77192, 77202, 77212, 77222, 77232, 77242,
    	77252, 77262, 77272, 77282, 77292, 77302, 77312, 77322, 77332, 77342,
    	77352, 77362, 77372, 77382, 77392, 77402, 77412, 77422, 77432, 77442,
    	77452, 77462, 77472, 77482, 77492, 77502, 77512, 77522, 77532, 77542,
    	77552, 77562, 77572, 77582, 77592, 77602, 77612, 77622, 77632, 77642,
    	77652, 77662, 77672, 77682, 77692, 77702, 77712, 77722, 77732, 77742,
    	77752, 77762, 77772, 77782, 77792, 77802, 77812, 77822, 77832, 77842,
    	77852, 77862, 77872, 77882, 77892, 77902, 77912, 77922, 77932, 77942,
    	77952, 77962, 77972, 77982, 77992, 78002, 78012, 78022, 78032, 78042,
    	78052, 78062, 78072, 78082, 78092, 78102, 78112, 78122, 78132, 78142,
    	78152, 78162, 78172, 78182, 78192, 78202, 78212, 78222, 78232, 78242,
    	78252, 78262, 78272, 78282, 78292, 78302, 78312, 78322, 78332, 78342,
    	78352, 78362, 78372, 78382, 78392, 78402, 78412, 78422, 78432, 78442,
    	78452, 78462, 78472, 78482, 78492, 78502, 78512, 78522, 78532, 78542,
    	78552, 78562, 78572, 78582, 78592, 78602, 78612, 78622, 78632, 78642,
    	78652, 78662, 78672, 78682, 78692, 78702, 78712, 78722, 78732, 78742,
    	78752, 78762, 78772, 78782, 78792, 78802, 78812, 78822, 78832, 78842,
    	78852, 78862, 78872, 78882, 78892, 78902, 78912, 78922, 78932, 78942,
    	78952, 78962, 78972, 78982, 78992, 79002, 79012, 79022, 79032, 79042,
    	79052, 79062, 79072, 79082, 79092, 79102, 79112, 79122, 79132, 79142,
    	79152, 79162, 79172, 79182, 79192, 79202, 79212, 79222, 79232, 79242,
    	79252, 79262, 79272, 79282, 79292, 79302, 79312, 79322, 79332, 79342,
    	79352, 79362, 79372, 79382, 79392, 79402, 79412, 79422, 79432, 79442,
    	79452, 79462, 79472, 79482, 79492, 79502, 79512, 79522, 79532, 79542,
    	79552, 79562, 79572, 79582, 79592, 79602, 79612, 79622, 79632, 79642,
    	79652, 79662, 79672, 79682, 79692, 79702, 79712, 79722, 79732, 79742,
    	79752, 79762, 79772, 79782, 79792, 79802, 79812, 79822, 79832, 79842,
    	79852, 79862, 79872, 79882, 79892, 79902, 79912, 79922, 79932, 79942,
    	79952, 79962, 79972, 79982, 79992, 80002, 80012, 80022, 80032, 80042,
    	80052, 80062, 80072, 80082, 80092, 80102, 80112, 80122, 80132, 80142,
    	80152, 80162, 80172, 80182, 80192, 80202, 80212, 80222, 80232, 80242,
    	80252, 80262, 80272, 80282, 80292, 80302, 80312, 80322, 80332, 80342,
    	80352, 80362, 80372, 80382, 80392, 80402, 80412, 80422, 80432, 80442,
    	80452, 80462, 80472, 80482, 80492, 80502, 80512, 80522, 80532, 80542,
    	80552, 80562, 80572, 80582, 80592, 80602, 80612, 80622, 80632, 80642,
    	80652, 80662, 80672, 80682, 80692, 80702, 80712, 80722, 80732, 80742,
    	80752, 80762, 80772, 80782, 80792, 80802, 80812, 80822, 80832, 80842,
    	80852, 80862, 80872, 80882, 80892, 80902, 80912, 80922, 80932, 80942,
    	80952, 80962, 80972, 80982, 80992, 81002, 81012, 81022, 81032, 81042,
    	81052, 81062, 81072, 81082, 81092, 81102, 81112, 81122, 81132, 81142,
    	81152, 81162, 81172, 81182, 81192, 81202, 81212, 81222, 81232, 81242,
    	81252, 81262, 81272, 81282, 81292, 81302, 81312, 81322, 81332, 81342,
    	81352, 81362, 81372, 81382, 81392, 81402, 81412, 81422, 81432, 81442,
    	81452, 81462, 81472, 81482, 81492, 81502, 81512, 81522, 81532, 81542,
    	81552, 81562, 81572, 81582, 81592, 81602, 81612, 81622, 81632, 81642,
    	81652, 81662, 81672, 81682, 81692, 81702, 81712, 81722, 81732, 81742,
    	81752, 81762, 81772, 81782, 81792, 81802, 81812, 81822, 81832, 81842,
    	81852, 81862, 81872, 81882, 81892, 81902, 81912, 81922, 81932, 81942,
    	81952, 81962, 81972, 81982, 81992, 82002, 82012, 82022, 82032, 82042,
    	82052, 82062, 82072, 82082, 82092, 82102, 82112, 82122, 82132, 82142,
    	82152, 82162, 82172, 82182, 82192, 82202, 82212, 82222, 82232, 82242,
    	82252, 82262, 82272, 82282, 82292, 82302, 82312, 82322, 82332, 82342,
    	82352, 82362, 82372, 82382, 82392, 82402, 82412, 82422, 82432, 82442,
    	82452, 82462, 82472, 82482, 82492, 82502, 82512, 82522, 82532, 82542,
    	82552, 82562, 82572, 82582, 82592, 82602, 82612, 82622, 82632, 82642,
    	82652, 82662, 82672, 82682, 82692, 82702, 82712, 82722, 82732, 82742,
    	82752, 82762, 82772, 82782, 82792, 82802, 82812, 82822, 82832, 82842,
    	82852, 82862, 82872, 82882, 82892, 82902, 82912, 82922, 82932, 82942,
    	82952, 82962, 82972, 82982, 82992, 83002, 83012, 83022, 83032, 83042,
    	83052, 83062, 83072, 83082, 83092, 83102, 83112, 83122, 83132, 83142,
    	83152, 83162, 83172, 83182, 83192, 83202, 83212, 83222, 83232, 83242,
    	83252, 83262, 83272, 83282, 83292, 83302, 83312, 83322, 83332, 83342,
    	83352, 83362, 83372, 83382, 83392, 83402, 83412, 83422, 83432, 83442,
    	83452, 83462, 83472, 83482, 83492, 83502, 83512, 83522, 83532, 83542,
    	83552, 83562, 83572, 83582, 83592, 83602, 83612, 83622, 83632, 83642,
    	83652, 83662, 83672, 83682, 83692, 83702, 83712, 83722, 83732, 83742,
    	83752, 83762, 83772, 83782, 83792, 83802, 83812, 83822, 83832, 83842,
    	83852, 83862, 83872, 83882, 83892, 83902, 83912, 83922, 83932, 83942,
    	83952, 83962, 83972, 83982, 83992, 84002, 84012, 84022, 84032, 84042,
    	84052, 84062, 84072, 84082, 84092, 84102, 84112, 84122, 84132, 84142,
    	84152, 84162, 84172, 84182, 84192, 84202, 84212, 84222, 84232, 84242,
    	84252, 84262, 84272, 84282, 84292, 84302, 84312, 84322, 84332, 84342,
    	84352, 84362, 84372, 84382, 84392, 84402, 84412, 84422, 84432, 84442,
    	84452, 84462, 84472, 84482, 84492, 84502, 84512, 84522, 84532, 84542,
    	84552, 84562, 84572, 84582, 84592, 84602, 84612, 84622, 84632, 84642,
    	84652, 84662, 84672, 84682, 84692, 84702, 84712, 84722, 84732, 84742,
    	84752, 84762, 84772, 84782, 84792, 84802, 84812, 84822, 84832, 84842,
    	84852, 84862, 84872, 84882, 84892, 84902, 84912, 84922, 84932, 84942,
    	84952, 84962, 84972, 84982, 84992, 85002, 85012, 85022, 85032, 85042,
    	85052, 85062, 85072, 85082, 85092, 85102, 85112, 85122, 85132, 85142,
    	85152, 85162, 85172, 85182, 85192, 85202, 85212, 85222, 85232, 85242,
    	85252, 85262, 85272, 85282, 85292, 85302, 85312, 85322, 85332, 85342,
    	85352, 85362, 85372, 85382, 85392, 85402, 85412, 85422, 85432, 85442,
    	85452, 85462, 85472, 85482, 85492, 85502, 85512, 85522, 85532, 85542,
    	85552, 85562, 85572, 85582, 85592, 85602, 85612, 85622, 85632, 85642,
    	85652, 85662, 85672, 85682, 85692, 85702, 85712, 85722, 85732, 85742,
    	85752, 85762, 85772, 85782, 85792, 85802, 85812, 85822, 85832, 85842,
    	85852, 85862, 85872, 85882, 85892, 85902, 85912, 85922, 85932, 85942,
    	85952, 85962, 85972, 85982, 85992, 86002, 86012, 86022, 86032, 86042,
    	86052, 86062, 86072, 86082, 86092, 86102, 86112, 86122, 86132, 86142,
    	86152, 86162, 86172, 86182, 86192, 86202, 86212, 86222, 86232, 86242,
    	86252, 86262, 86272, 86282, 86292, 86302, 86312, 86322, 86332, 86342,
    	86352, 86362, 86372, 86382, 86392, 86402, 86412, 86422, 86432, 86442,
    	86452, 86462, 86472, 86482, 86492, 86502, 86512, 86522, 86532, 86542,
    	86552, 86562, 86572, 86582, 86592, 86602, 86612, 86622, 86632, 86642,
    	86652, 86662, 86672, 86682, 86692, 86702, 86712, 86722, 86732, 86742,
    	86752, 86762, 86772, 86782, 86792, 86802, 86812, 86822, 86832, 86842,
    	86852, 86862, 86872, 86882, 86892, 86902, 86912, 86922, 86932, 86942,
    	86952, 86962, 86972, 86982, 86992, 87002, 87012, 87022, 87032, 87042,
    	87052, 87062, 87072, 87082, 87092, 87102, 87112, 87122, 87132, 87142,
    	87152, 87162, 87172, 87182, 87192, 87202, 87212, 87222, 87232, 87242,
    	87252, 87262, 87272, 87282, 87292, 87302, 87312, 87322, 87332, 87342,
    	87352, 87362, 87372, 87382, 87392, 87402, 87412, 87422, 87432, 87442,
    	87452, 87462, 87472, 87482, 87492, 87502, 87512, 87522, 87532, 87542,
    	87552, 87562, 87572, 87582, 87592, 87602, 87612, 87622, 87632, 87642,
    	87652, 87662, 87672, 87682, 87692, 87702, 87712, 87722, 87732, 87742,
    	87752, 87762, 87772, 87782, 87792, 87802, 87812, 87822, 87832, 87842,
    	87852, 87862, 87872, 87882, 87892, 87902, 87912, 87922, 87932, 87942,
    	87952, 87962, 87972, 87982, 87992, 88002, 88012, 88022, 88032, 88042,
    	88052, 88062, 88072, 88082, 88092, 88102, 88112, 88122, 88132, 88142,
    	88152, 88162, 88172, 88182, 88192, 88202, 88212, 88222, 88232, 88242,
    	88252, 88262, 88272, 88282, 88292, 88302, 88312, 88322, 88332, 88342,
    	88352, 88362, 88372, 88382, 88392, 88402, 88412, 88422, 88432, 88442,
    	88452, 88462, 88472, 88482, 88492, 88502, 88512, 88522, 88532, 88542,
    	88552, 88562, 88572, 88582, 88592, 88602, 88612, 88622, 88632, 88642,
    	88652, 88662, 88672, 88682, 88692, 88702, 88712, 88722, 88732, 88742,
    	88752, 88762, 88772, 88782, 88792, 88802, 88812, 88822, 88832, 88842,
    	88852, 88862, 88872, 88882, 88892, 88902, 88912, 88922, 88932, 88942,
    	88952, 88962, 88972, 88982, 88992, 89002, 89012, 89022, 89032, 89042,
    	89052, 89062, 89072, 89082, 89092, 89102, 89112, 89122, 89132, 89142,
    	89152, 89162, 89172, 89182, 89192, 89202, 89212, 89222, 89232, 89242,
    	89252, 89262, 89272, 89282, 89292, 89302, 89312, 89322, 89332, 89342,
    	89352, 89362, 89372, 89382, 89392, 89402, 89412, 89422, 89432, 89442,
    	89452, 89462, 89472, 89482, 89492, 89502, 89512, 89522, 89532, 89542,
    	89552, 89562, 89572, 89582, 89592, 89602, 89612, 89622, 89632, 89642,
    	89652, 89662, 89672, 89682, 89692, 89702, 89712, 89722, 89732, 89742,
    	89752, 89762, 89772, 89782, 89792, 89802, 89812, 89822, 89832, 89842,
    	89852, 89862, 89872, 89882, 89892, 89902, 89912, 89922, 89932, 89942,
    	89952, 89962, 89972, 89982, 89992, 90002, 90012, 90022, 90032, 90042,
    	90052, 90062, 90072, 90082, 90092, 90102, 90112, 90122, 90132, 90142,
    	90152, 90162, 90172, 90182, 90192, 90202, 90212, 90222, 90232, 90242,
    	90252, 90262, 90272, 90282, 90292, 90302, 90312, 90322, 90332, 90342,
    	90352, 90362, 90372, 90382, 90392, 90402, 90412, 90422, 90432, 90442,
    	90452, 90462, 90472, 90482, 90492, 90502, 90512, 90522, 90532, 90542,
    	90552, 90562, 90572, 90582, 90592, 90602, 90612, 90622, 90632, 90642,
    	90652, 90662, 90672, 90682, 90692, 90702, 90712, 90722, 90732, 90742,
    	90752, 90762, 90772, 90782, 90792, 90802, 90812, 90822, 90832, 90842,
    	90852, 90862, 90872, 90882, 90892, 90902, 90912, 90922, 90932, 90942,
    	90952, 90962, 90972, 90982, 90992, 91002, 91012, 91022, 91032, 91042,
    	91052, 91062, 91072, 91082, 91092, 91102, 91112, 91122, 91132, 91142,
    	91152, 91162, 91172, 91182, 91192, 91202, 91212, 91222, 91232, 91242,
    	91252, 91262, 91272, 91282, 91292, 91302, 91312, 91322, 91332, 91342,
    	91352, 91362, 91372, 91382, 91392, 91402, 91412, 91422, 91432, 91442,
    	91452, 91462, 91472, 91482, 91492, 91502, 91512, 91522, 91532, 91542,
    	91552, 91562, 91572, 91582, 91592, 91602, 91612, 91622, 91632, 91642,
    	91652, 91662, 91672, 91682, 91692, 91702, 91712, 91722, 91732, 91742,
    	91752, 91762, 91772, 91782, 91792, 91802, 91812, 91822, 91832, 91842,
    	91852, 91862, 91872, 91882, 91892, 91902, 91912, 91922, 91932, 91942,
    	91952, 91962, 91972, 91982, 91992, 92002, 92012, 92022, 92032, 92042,
    	92052, 92062, 92072, 92082, 92092, 92102, 92112, 92122, 92132, 92142,
    	92152, 92162, 92172, 92182, 92192, 92202, 92212, 92222, 92232, 92242,
    	92252, 92262, 92272, 92282, 92292, 92302, 92312, 92322, 92332, 92342,
    	92352, 92362, 92372, 92382, 92392, 92402, 92412, 92422, 92432, 92442,
    	92452, 92462, 92472, 92482, 92492, 92502, 92512, 92522, 92532, 92542,
    	92552, 92562, 92572, 92582, 92592, 92602, 92612, 92622, 92632, 92642,
    	92652, 92662, 92672, 92682, 92692, 92702, 92712, 92722, 92732, 92742,
    	92752, 92762, 92772, 92782, 92792, 92802, 92812, 92822, 92832, 92842,
    	92852, 92862, 92872, 92882, 92892, 92902, 92912, 92922, 92932, 92942,
    	92952, 92962, 92972, 92982, 92992, 93002, 93012, 93022, 93032, 93042,
    	93052, 93062, 93072, 93082, 93092, 93102, 93112, 93122, 93132, 93142,
    	93152, 93162, 93172, 93182, 93192, 93202, 93212, 93222, 93232, 93242,
    	93252, 93262, 93272, 93282, 93292, 93302, 93312, 93322, 93332, 93342,
    	93352, 93362, 93372, 93382, 93392, 93402, 93412, 93422, 93432, 93442,
    	93452, 93462, 93472, 93482, 93492, 93502, 93512, 93522, 93532, 93542,
    	93552, 93562, 93572, 93582, 93592, 93602, 93612, 93622, 93632, 93642,
    	93652, 93662, 93672, 93682, 93692, 93702, 93712, 93722, 93732, 93742,
    	93752, 93762, 93772, 93782, 93792, 93802, 93812, 93822, 93832, 93842,
    	93852, 93862, 93872, 93882, 93892, 93902, 93912, 93922, 93932, 93942,
    	93952, 93962, 93972, 93982, 93992, 94002, 94012, 94022, 94032, 94042,
    	94052, 94062, 94072, 94082, 94092, 94102, 94112, 94122, 94132, 94142,
    	94152, 94162, 94172, 94182, 94192, 94202, 94212, 94222, 94232, 94242,
    	94252, 94262, 94272, 94282, 94292, 94302, 94312, 94322, 94332, 94342,
    	94352, 94362, 94372, 94382, 94392, 94402, 94412, 94422, 94432, 94442,
    	94452, 94462, 94472, 94482, 94492, 94502, 94512, 94522, 94532, 94542,
    	94552, 94562, 94572, 94582, 94592, 94602, 94612, 94622, 94632, 94642,
    	94652, 94662, 94672, 94682, 94692, 94702, 94712, 94722, 94732, 94742,
    	94752, 94762, 94772, 94782, 94792, 94802, 94812, 94822, 94832, 94842,
    	94852, 94862, 94872, 94882, 94892, 94902, 94912, 94922, 94932, 94942,
    	94952, 94962, 94972, 94982, 94992, 95002, 95012, 95022, 95032, 95042,
    	95052, 95062, 95072, 95082, 95092, 95102, 95112, 95122, 95132, 95142,
    	95152, 95162, 95172, 95182, 95192, 95202, 95212, 95222, 95232, 95242,
    	95252, 95262, 95272, 95282, 95292, 95302, 95312, 95322, 95332, 95342,
    	95352, 95362, 95372, 95382, 95392, 95402, 95412, 95422, 95432, 95442,
    	95452, 95462, 95472, 95482, 95492, 95502, 95512, 95522, 95532, 95542,
    	95552, 95562, 95572, 95582, 95592, 95602, 95612, 95622, 95632, 95642,
    	95652, 95662, 95672, 95682, 95692, 95702, 95712, 95722, 95732, 95742,
    	95752, 95762, 95772, 95782, 95792, 95802, 95812, 95822, 95832, 95842,
    	95852, 95862, 95872, 95882, 95892, 95902, 95912, 95922, 95932, 95942,
    	95952, 95962, 95972, 95982, 95992, 96002, 96012, 96022, 96032, 96042,
    	96052, 96062, 96072, 96082, 96092, 96102, 96112, 96122, 96132, 96142,
    	96152, 96162, 96172, 96182, 96192, 96202, 96212, 96222, 96232, 96242,
    	96252, 96262, 96272, 96282, 96292, 96302, 96312, 96322, 96332, 96342,
    	96352, 96362, 96372, 96382, 96392, 96402, 96412, 96422, 96432, 96442,
    	96452, 96462, 96472, 96482, 96492, 96502, 96512, 96522, 96532, 96542,
    	96552, 96562, 96572, 96582, 96592, 96602, 96612, 96622, 96632, 96642,
    	96652, 96662, 96672, 96682, 96692, 96702, 96712, 96722, 96732, 96742,
    	96752, 96762, 96772, 96782, 96792, 96802, 96812, 96822, 96832, 96842,
    	96852, 96862, 96872, 96882, 96892, 96902, 96912, 96922, 96932, 96942,
    	96952, 96962, 96972, 96982, 96992, 97002, 97012, 97022, 97032, 97042,
    	97052, 97062, 97072, 97082, 97092, 97102, 97112, 97122, 97132, 97142,
    	97152, 97162, 97172, 97182, 97192, 97202, 97212, 97222, 97232, 97242,
    	97252, 97262, 97272, 97282, 97292, 97302, 97312, 97322, 97332, 97342,
    	97352, 97362, 97372, 97382, 97392, 97402, 97412, 97422, 97432, 97442,
    	97452, 97462, 97472, 97482, 97492, 97502, 97512, 97522, 97532, 97542,
    	97552, 97562, 97572, 97582, 97592, 97602, 97612, 97622, 97632, 97642,
    	97652, 97662, 97672, 97682, 97692, 97702, 97712, 97722, 97732, 97742,
    	97752, 97762, 97772, 97782, 97792, 97802, 97812, 97822, 97832, 97842,
    	97852, 97862, 97872, 97882, 97892, 97902, 97912, 97922, 97932, 97942,
    	97952, 97962, 97972, 97982, 97992, 98002, 98012, 98022, 98032, 98042,
    	98052, 98062, 98072, 98082, 98092, 98102, 98112, 98122, 98132, 98142,
    	98152, 98162, 98172, 98182, 98192, 98202, 98212, 98222, 98232, 98242,
    	98252, 98262, 98272, 98282, 98292, 98302, 98312, 98322, 98332, 98342,
    	98352, 98362, 98372, 98382, 98392, 98402, 98412, 98422, 98432, 98442,
    	98452, 98462, 98472, 98482, 98492, 98502, 98512, 98522, 98532, 98542,
    	98552, 98562, 98572, 98582, 98592, 98602, 98612, 98622, 98632, 98642,
    	98652, 98662, 98672, 98682, 98692, 98702, 98712, 98722, 98732, 98742,
    	98752, 98762, 98772, 98782, 98792, 98802, 98812, 98822, 98832, 98842,
    	98852, 98862, 98872, 98882, 98892, 98902, 98912, 98922, 98932, 98942,
    	98952, 98962, 98972, 98982, 98992, 99002, 99012, 99022, 99032, 99042,
    	99052, 99062, 99072, 99082, 99092, 99102, 99112, 99122, 99132, 99142,
    	99152, 99162, 99172, 99182, 99192, 99202, 99212, 99222, 99232, 99242,
    	99252, 99262, 99272, 99282, 99292, 99302, 99312, 99322, 99332, 99342,
    	99352, 99362, 99372, 99382, 99392, 99402, 99412, 99422, 99432, 99442,
    	99452, 99462, 99472, 99482, 99492, 99502, 99512, 99522, 99532, 99542,
    	99552, 99562, 99572, 99582, 99592, 99602, 99612, 99622, 99632, 99642,
    	99652, 99662, 99672, 99682, 99692, 99702, 99712, 99722, 99732, 99742,
    	99752, 99762, 99772, 99782, 99792, 99802, 99812, 99822, 99832, 99842,
    	99852, 99862, 99872, 99882, 99892, 99902, 99912, 99922, 99932, 99942
    };
    
    
    
    #define BUFFER_SIZE 2048
    
    int main()
    {
    	HANDLE input;
    
    	CHAR *buffer;
    	CHAR *readbuffer;
    	CHAR *buffermax;
    	DWORD read;
    	OVERLAPPED overlapped;
    
    	int total;
    	register int num;
    	int count;
    
    
    	input = CreateFile(".\\numbers.txt", GENERIC_READ, FILE_SHARE_READ, NULL,
    		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL);
    
    	if (input == INVALID_HANDLE_VALUE)
    	{
    		printf("unable to open file\n");
    		return EXIT_FAILURE;
    	}
    
    	buffer = (char *)VirtualAlloc(NULL, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE);
    	readbuffer = (char *)VirtualAlloc(NULL, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE);
    	read = 0;
    	ZeroMemory(&overlapped, sizeof(overlapped));
    
    	total = 0;
    	num = 0;
    	count = 0;
    
    
    	ReadFileEx(input, buffer, BUFFER_SIZE, &overlapped, NULL);
    	WaitForSingleObjectEx(input, 10000, FALSE);
    
    	GetOverlappedResult(input, &overlapped, &read, FALSE);
    	overlapped.Offset += read;
    
    
    	while (ReadFileEx(input, readbuffer, BUFFER_SIZE, &overlapped, NULL) != 0)
    	{
    		buffermax = buffer + BUFFER_SIZE;
    		for (register CHAR *ch = buffer; ch < buffermax; ch++)
    		{
    			if (*ch == ' ')
    			{
    				total += num;
    				num = 0;
    				count++;
    				continue;
    			}
    
    			if (num < 10000)
    			{
    				num = multable[num] + *ch;
    			}
    			else
    			{
    				num *= 10;
    				num += *ch - '0';
    			}
    		}
    
    
    		WaitForSingleObjectEx(input, 1000, FALSE);
    		overlapped.Offset += BUFFER_SIZE;
    		__asm
    		{
    			push buffer
    			push readbuffer
    			pop buffer
    			pop readbuffer
    		}
    	}
    
    
    	GetOverlappedResult(input, &overlapped, &read, FALSE);
    	buffermax = buffer + read;
    
    	for (register CHAR *ch = buffer; ch < buffermax; ch++)
    	{
    		if (*ch == ' ')
    		{
    			total += num;
    			num = 0;
    			count++;
    			continue;
    		}
    
    		if (num < 10000)
    		{
    			num = multable[num] + *ch;
    		}
    		else
    		{
    			num *= 10;
    			num += *ch - '0';
    		}
    	}
    
    
    	VirtualFree(readbuffer, BUFFER_SIZE, MEM_DECOMMIT);
    	VirtualFree(buffer, BUFFER_SIZE, MEM_DECOMMIT);
    	CloseHandle(input);
    
    
    	printf("average: %i\n", total / count);
    	return EXIT_SUCCESS;
    }
    My best code is written with the delete key.

  6. #6
    Code Goddess Prelude's Avatar
    Join Date
    Sep 2001
    Posts
    9,897
    And Fordy's entry:
    Code:
    //#######################################################
    //##	Almost Daily Contest #3
    //##		
    //##	Entry by Fordy 
    //##
    //##	Written using VC++6 (Also compiles with VC++7)
    //##
    //##	Environment/Requirements - 
    //##		Windows XP (2000 should be ok though - untested)
    //##		AMD XP2000 (should also work with any recent IA32 CPU)
    //##		Release version for VC++ with;
    //##			No ATL or MFC
    //##			RTTI off
    //##			Exception handling off
    //##			Optimisations set to "Maximum Speed"
    //##
    //##
    //##	Disclaimer - The instructions look garbled in places
    //##		....but where they do, it's usually because 
    //##		they seem to work a little faster because of it.
    //##
    //##	Assumptions - As per Contest Master's sample number generation
    //##		program, all values are either 1 or 2 digits, unsigned, and
    //##		are followed by a space
    //##
    //##
    //##
    
    
    #define VC_EXTRALEAN 
    #include <windows.h>
    #include <cstdio>
    #include <cstdlib>
    
    DWORD FileSize;
    LPVOID Data;
    
    
    __declspec(naked) DWORD Read()
    {
    	__asm
    	{
    		PUSH ESI				
    		PUSH EDI
    		CLD	
    		XOR EDX,EDX		
    		MOV EDI, FileSize
    		MOV ESI, Data
    NextRead:										
    		MOV EAX,[ESI]
    		ADD ESI,0x4		
    		CMP AH,0x20
    		JZ OnePlusTwo	
    		MOV ECX,EAX							
    		MOV AL,[ESI]
    		ADD ESI,0x1	
    		CMP AL,0x20
    		JZ TwoPlusOne		
    		AND EAX,0xF
    		BSWAP ECX
    		ADD EDX,EAX
    		MOV AL,CL
    		AND EAX,0xF
    		LEA EAX,[EAX+EAX*4]		
    		LEA EAX,[EAX+EAX]
    		BSWAP ECX
    		ADD EDX,EAX
    		AND ECX,0x0F0F
    		MOV AL,CH
    		ADD EDX,EAX
    		MOV AL,CL
    		INC ESI
    MultAddAL:		
    		AND EAX,0xF								
    		LEA EAX,[EAX+EAX*4]				
    		LEA EAX,[EAX+EAX]						
    		ADD EDX,EAX	
    		SUB EDI,0x6
    		JNG End
    		JMP NextRead
    TwoPlusOne:	
    		MOV EAX,ECX	
    		XOR ECX,ECX	
    		AND EAX,0x0F000F0F
    		MOV CL,AH							
    		ADD EDX,ECX						 							
    		BSWAP EAX						
    		MOV CL,AL							
    		ADD EDX,ECX	
    		BSWAP EAX
    		INC EDI
    		JMP MultAddAL
    OnePlusTwo:									
    		BSWAP EAX
    		CMP AL,0x20
    		JZ OnePlusOne
    		BSWAP EAX
    		XOR ECX,ECX
    		AND EAX,0xF0F000F											
    		MOV CL,AL							
    		ADD EDX,ECX										
    		BSWAP EAX							
    		MOV CL,AL						
    		ADD EDX,ECX							
    		MOV AL,AH						
    		INC ESI
    		INC EDI
    		JMP MultAddAL
    OnePlusOne:
    		AND EAX,0x0F000F00	
    		XOR ECX,ECX
    		MOV CL,AH
    		ADD EDX,ECX						
    		BSWAP EAX
    		MOV CL,AL
    		SUB EDI,0x4
    		ADD EDX,ECX
    		JNG End
    		JMP NextRead
    End:	
    		MOV EAX,EDX
    		POP EDI
    		POP ESI					
    		RET
    	}
    }
    
    int main()
    {
    	SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
    	SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
    
    
    	HANDLE File = CreateFile("C:\\Numbers.txt",GENERIC_READ,0,0,OPEN_EXISTING,
    		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,0);
    	if(File == INVALID_HANDLE_VALUE)
    	{
    		return EXIT_FAILURE;
    	}
    	FileSize = GetFileSize(File,0);
    	if(FileSize == INVALID_FILE_SIZE)
    	{
    		CloseHandle(File);
    		return EXIT_FAILURE;
    	}
    	HANDLE Mapping = CreateFileMapping(File,0,PAGE_READONLY,0,0,0);
    	if(Mapping == 0)
    	{
    		CloseHandle(File);
    		return EXIT_FAILURE;
    	}
    	Data = MapViewOfFile(Mapping,FILE_MAP_READ,0,0,0);
    	if(Data != 0)
    	{	
    		DWORD Sum = Read();
    		printf("Sum = %d\n",Sum);
    	}
    	else
    	{
    		CloseHandle(Mapping);
    		CloseHandle(File);
    		return EXIT_FAILURE;
    	}
    
    	SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
    	SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS);
    	return EXIT_SUCCESS;
    }
    My best code is written with the delete key.

  7. #7
    Just because ygfperson's Avatar
    Join Date
    Jan 2002
    Posts
    2,490
    congrats fordy.

    I gotta take a look at that code... I thought mine would beat all.

    //edit: here's mine, cleaned up a little

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
      char *input_buffer, *start, *pointer;
      int count = 0, MAX_BUFFER;
      double total;
      int placement[9] = {0,0,0,0,0,0,0,0,0}, *place;
      FILE* input;
      place = placement;
    
      input = fopen("numbers.txt", "ra");
      if (input == NULL) {
        printf("Invalid file\n");
        fflush(stdout);
        return 1;
      }
      fseek(input,0,SEEK_END);
      MAX_BUFFER = (ftell(input) & ~0x3) + 4; //round up to nearest 4
      fseek(input,0,SEEK_SET);
    
      input_buffer = (char*)malloc(MAX_BUFFER * sizeof(char));
      start = pointer = input_buffer;
      ++start;
    
      pointer += MAX_BUFFER;
      fread(start,sizeof(int),MAX_BUFFER >> 2, input);
    
      while (!*pointer)
        --pointer;
      
      for (;*pointer;) {  //critical loop
        while (!(*pointer & 0x10))
          --pointer;
    
        while (*pointer & 0x10)   //this assumes only numbers and whitespace
          *place++ += *pointer-- & 0xF;
        place = placement;
        ++count;
       
      }
      total = placement[0] + placement[1]*10 + placement[2]*100 + placement[3]*1000 + placement[4]*10000 + placement[5]*100000 + placement[6]*1000000 + placement[7]*10000000 + placement[8]*100000000;
      total /= count;
    
      printf("%f\n",total);
      fflush(stdout);
      free(input_buffer);
    
      return 0;
    }
    Last edited by ygfperson; 08-17-2003 at 10:34 AM.

  8. #8
    pronounced 'fib' FillYourBrain's Avatar
    Join Date
    Aug 2002
    Posts
    2,297
    good job fordy. I'll have to look over all of your entries. I did quite a bit worse than I thought I would.

    Fordy, I must admit to being a little lost on your code. Perhaps an algorithm explanation? I'm not much for reading assembly.

    the difference between ygpersonf's and mine is the fact that I was trying to maintain base 10 digits in my summation. Big mistake. Smarter code ygf. On the other hand, the numbers had better never exceed 10 digits! That's one area mine may have slowed down. I made a determination to handle a large number of digits.

    This is where I think I may not do well in these contests. I don't like to make too many assumptions about input. It has been hard to steer myself in that direction for the sake of speed in these contests already. Oh well. Fun anyway.
    Last edited by FillYourBrain; 08-17-2003 at 12:56 PM.
    "You are stupid! You are stupid! Oh, and don't forget, you are STUPID!" - Dexter

  9. #9
    C++ Developer XSquared's Avatar
    Join Date
    Jun 2002
    Location
    Ontario, Canada
    Posts
    2,718
    I agree. One look at your code and I was completely lost.
    Naturally I didn't feel inspired enough to read all the links for you, since I already slaved away for long hours under a blistering sun pressing the search button after typing four whole words! - Quzah

    You. Fetch me my copy of the Wall Street Journal. You two, fight to the death - Stewie

  10. #10
    Just Lurking Dave_Sinkula's Avatar
    Join Date
    Oct 2002
    Posts
    5,005

    Re: ADC #3 Results

    >Dave_Sinkula: 2234.053ms

    Whoo-hooo!

    It's nice to actually attach numbers to 'fast' and 'slow' once in a while. Although it will probably be embarrassing later on, it was fun to try a standard newbish approach and play that against much more finely tuned methods.

    And thanks to all the serious entrants for showing me new things.
    7. It is easier to write an incorrect program than understand a correct one.
    40. There are two ways to write error-free programs; only the third one works.*

  11. #11
    pronounced 'fib' FillYourBrain's Avatar
    Join Date
    Aug 2002
    Posts
    2,297
    all entries are serious. try again next time. Learn something every time. That goes for all of us (except Fordy )
    "You are stupid! You are stupid! Oh, and don't forget, you are STUPID!" - Dexter

  12. #12
    Registered User
    Join Date
    Jan 2003
    Posts
    648
    Yea, I wish I would've made assumptions on the input, like 1-2 digit numbers. Then it would have been easy to unroll it in a loop and rewrite in assembler. Simple and fast. But good job all. Next time we could have more specifics on what we can and cannot assume.

    Fordy, what's that mapping thing you do? Is it similar to asyncronous reading that I do or that other one, ummm, batch async reading or whatever its called -- reads it to an array of struct of buffers.

  13. #13
    Registered User
    Join Date
    Aug 2003
    Posts
    10
    dang, i knew it was over on sunday, but i didn't expect results for a couple days. here's what i wrote last night that i was gonna submit. any way you can tell me how fast it would be on your system?

    Code:
    #include <fstream>
    using namespace std;
    
    int main()
    {
    	FILE *fp;
    	fp = fopen("numbers.txt", "r");
    	int total(0), num;
    
    	for (int i = 0; i < 1000000; i++)
    	{
    		fscanf(fp, "%d", &num);
    		total += num;
    	}
    
    	fclose(fp);
    	printf("%d", total/1000000);
    
    }
    oh, and i compiled with: "gcc -Wall -O3 file.cpp"
    ???

  14. #14
    Pursuing knowledge confuted's Avatar
    Join Date
    Jun 2002
    Posts
    1,916
    Karsh, that would have very similar performance to Dave's entry. Look at his code and look at yours.
    Away.

  15. #15
    Registered User
    Join Date
    Aug 2003
    Posts
    10
    I saw his code. It ran in 625 ms on my machine (1.54GHz Athlon XP on XP Pro, using MinGW and GCC 3.3 as compiler).

    I don't expect it to be the fastest, but he does have floating point file reading and arithmatic which should take a good bit longer.
    ???

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. 72hour GDC Results
    By jverkoey in forum A Brief History of Cprogramming.com
    Replies: 3
    Last Post: 07-05-2004, 11:46 PM
  2. ADC #4 Results
    By Prelude in forum Contests Board
    Replies: 9
    Last Post: 08-28-2003, 01:38 PM
  3. ADC #2 Results
    By Prelude in forum Contests Board
    Replies: 20
    Last Post: 08-11-2003, 06:59 AM
  4. ADC #1 Results
    By Prelude in forum Contests Board
    Replies: 26
    Last Post: 08-06-2003, 03:57 AM
  5. Same seed for srand yields different results
    By codegirl in forum C++ Programming
    Replies: 3
    Last Post: 06-23-2003, 02:39 PM