描述 Description
考虑如下序列的生成算法:从整数n开始,如果n是偶数,把他除以2;如果他是奇数,把他乘3加1。用新得到的值重复上面的步骤,知道n=1为止。例如n=22时,这个算法的生成序列是:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
人们猜想(没有证明)对于任意的整数n,该算法总能得到终止于n=1。这个猜想至少对于1000000以内的数都正确。
对于给定的n,该序列的元素(包括1)个数称之为n的循环节长度。例如上例中循环节长度为16。
输入格式 Input Format
输入两个数i,j,你的任务是计算i到j(包含i和j),之间的整数中,循环节长度最大的值
并且有多组数据!
0<所有整数<=1000000
输出格式 Output Format
对于每对整数i,j,输出原来的i,j和循环节最大的长度
样例输入 Sample Input
1 10
100 200
201 210
900 1000
样例输出 Sample Output
1 10 20
100 200 125
201 210 89
900 1000 174
时间限制 Time Limitation
各个测试点2s
program b1039; var i,k,n:longint; a,b,c:array[1..1000]of longint; procedure digui(p:longint); begin if p=1 then exit else if (p mod 2 = 0) then begin digui(trunc(p / 2)); inc(n); end else begin digui(p*3+1); inc(n); end; end; function go(x:longint):longint; begin n := 1; digui(x); go := n; end; begin for i := 1 to 1000 do c[i]:=0; k:=1; while not eof do begin read (a[k],b[k]); for i := a[k] to b[k] do if go(i) > c[k] then c[k] := go(i); inc(k); end; for i := 1 to k-2 do writeln (a[i],' ',b[i],' ',c[i]); write (a[k-1],' ',b[k-1],' ',c[k-1]); end.
程序写的没问题,朴素模拟版。。然而。。。
VijosNT Mini 2.0.5.6
Free Pascal Compiler version 2.4.2 [2010/11/10] for i386
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Win32 for i386
Compiling foo.pas
Linking foo.exe
38 lines compiled, 0.0 sec , 29440 bytes code, 1544 bytes data
#01: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#02: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#03: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#04: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#05: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#06: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#07: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#08: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#09: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
#10: Runtime Error (0ms, 632KB)
读取访问违规, 地址: 0x00000004
Runtime Error / 0 / 0ms / 0KB