While trying to understand why my code didn't work (I kept getting WA) i discovered something intersting.
Here is the cyle for number 704511 :
704511
2113534
1056767
3170302
1585151
4755454
2377727
7133182
3566591
10699774
5349887
16049662
8024831
24074494
12037247
36111742
18055871
54167614
27083807
81251422
40625711
121877134
60938567
182815702
91407851
274223554
137111777
411335332
205667666
102833833
308501500
154250750
77125375
231376126
115688063
347064190
173532095
520596286
260298143
780894430
390447215
1171341646
585670823
1757012470
878506235
2635518706 : > 32 bit signed int. (int OR long)
1317759353
3953278060 : > 32 bit signed int. (int OR long)
1976639030
988319515
2964958546 : > 32 bit signed int. (int OR long)
1482479273
4447437820 : > 32 bit unsigned int. (unsigned int OR unsigned long)
2223718910 : > 32 bit signed int. (int OR long)
1111859455
3335578366 : > 32 bit signed int. (int OR long)
1667789183
5003367550 : > 32 bit unsigned int. (unsigned int OR unsigned long)
2501683775 : > 32 bit signed int. (int OR long)
7505051326 : > 32 bit unsigned int. (unsigned int OR unsigned long)
3752525663 : > 32 bit signed int. (int OR long)
11257576990 : > 32 bit unsigned int. (unsigned int OR unsigned long)
5628788495 : > 32 bit unsigned int. (unsigned int OR unsigned long)
16886365486 : > 32 bit unsigned int. (unsigned int OR unsigned long)
8443182743 : > 32 bit unsigned int. (unsigned int OR unsigned long)
25329548230 : > 32 bit unsigned int. (unsigned int OR unsigned long)
12664774115 : > 32 bit unsigned int. (unsigned int OR unsigned long)
37994322346 : > 32 bit unsigned int. (unsigned int OR unsigned long)
18997161173 : > 32 bit unsigned int. (unsigned int OR unsigned long)
56991483520 : > 32 bit unsigned int. (unsigned int OR unsigned long)
28495741760 : > 32 bit unsigned int. (unsigned int OR unsigned long)
14247870880 : > 32 bit unsigned int. (unsigned int OR unsigned long)
7123935440 : > 32 bit unsigned int. (unsigned int OR unsigned long)
3561967720 : > 32 bit signed int. (int OR long)
1780983860
890491930
445245965
1335737896
667868948
333934474
166967237
500901712
250450856
125225428
62612714
31306357
93919072
46959536
23479768
11739884
5869942
2934971
8804914
4402457
13207372
6603686
3301843
9905530
4952765
14858296
7429148
3714574
1857287
5571862
2785931
8357794
4178897
12536692
6268346
3134173
9402520
4701260
2350630
1175315
3525946
1762973
5288920
2644460
1322230
661115
1983346
991673
2975020
1487510
743755
2231266
1115633
3346900
1673450
836725
2510176
1255088
627544
313772
156886
78443
235330
117665
352996
176498
88249
264748
132374
66187
198562
99281
297844
148922
74461
223384
111692
55846
27923
83770
41885
125656
62828
31414
15707
47122
23561
70684
35342
17671
53014
26507
79522
39761
119284
59642
29821
89464
44732
22366
11183
33550
16775
50326
25163
75490
37745
113236
56618
28309
84928
42464
21232
10616
5308
2654
1327
3982
1991
5974
2987
8962
4481
13444
6722
3361
10084
5042
2521
7564
3782
1891
5674
2837
8512
4256
2128
1064
532
266
133
400
200
100
50
25
76
38
19
58
29
88
44
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1
704511 704511 243
As you can see, while computing the cycle length the number excedes the MAX_UINT. This means that if your "cycle length" function uses 32 bit integers it wont reach a correct result. In fact if you use int's, at some point the variable will wrap around to a negative value.
Now whats really wrong about this is that online-judge accepts programs that wield wrong answers.
Under windows environment I use unsigned __int64 as a 64 bit integer variable type. Under linux I think its long long, not sure though.
[c]
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define TABLE_SIZE 2500000
#ifdef WIN32
typedef unsigned __int64 UINT64;
#else
typedef ? UINT64;
#endif
/* 704511 */
unsigned short s_length[TABLE_SIZE];
unsigned short cycleLength(UINT64 n) {
unsigned short length = (n <= 0 || n > TABLE_SIZE) ? 0 : s_length[n];
/* if( n > UINT_MAX ) {
printf("%15I64d : > 32 bit unsigned int. (unsigned int OR unsigned long)\n", n);
}else
if( n > INT_MAX ) {
printf("%15I64d : > 32 bit signed int. (int OR long)\n", n);
}else {
printf("%15I64d\n", n);
}
*/
if( length == 0 ) {
/* cycle length of n not computed yet */
if( n & (UINT64)1 ) {
/* odd */
length = 1 + cycleLength(3 * n + 1);
}else {
/* even */
length = 1 + cycleLength(n / 2);
}
if( n > 0 && n < TABLE_SIZE ) {
s_length[n] = length;
}
}
return length;
}
int main() {
unsigned int i, j, k, n1, n2;
unsigned short max;
unsigned short length;
memset(s_length, 0, sizeof(s_length));
s_length[1] = 1;
while( scanf(" %u %u", &n1, &n2) == 2 ) {
max = 0;
if( n1 < n2 ) {
i = n1;
j = n2;
}else {
i = n2;
j = n1;
}
for(k = i ; k <= j; k++) {
length = cycleLength(k);
if( length > max ) {
max = length;
}
}
printf("%d %d %d\n", n1, n2, max);
}
return 0;
}
[/c]