我们定义具有4个正整数的类Collatz序列s
:
n
起始值d > 1
除数m > 1
乘数i
增量
(在原始Collatz序列中d = 2
m = 3
和i = 1
。)
给定这些整数s
将以以下方式创建:
s(0) = n
- 如果
k > 0
和s(k-1) mod d = 0
再s(k) = s(k-1) / d
- 如果
k > 0
和s(k-1) mod d != 0
再s(k) = s(k-1) * m + i
用一个例子的序列d = 2, m = 3, i = 5
和n = 80
将是s = 80, 40, 20, 10, 5, 20, 10, 5, 20, ...
。
每个序列将达到比任何给定界限更高的值(即序列是发散的),或者如果对于(t
和)相等,则为真,则进入无限循环。u
t!=u
s(t) = s(u)
在我们的问题中,如果序列元素的值大于10^9
或在第1000
th个元素之前没有元素重复,则该序列被视为发散的。
任务
您应该编写一个程序或函数,该程序或函数采用正整数d
m
并将其i
作为输入并输出起始值n = 1, 2, 3, ... 999, 1000
可以产生的序列的所有不同结束类型(无限循环和散度)。
输入详细信息
- 输入是代表一个字符串或列表(或者在你的语言最接近的等效)(在常见的方式)三位正整数
d
,m
并且i
按照这个顺序。d
并且m
至少2
。两者都不大于100
。
输出细节
输出规范有点罗word。可能值得首先查看示例。
- 您应该输出到标准输出(或最接近的替代品)或返回字符串。
- 如果可能出现发散序列,则第一行应为
DIVERGENT
。 - 序列循环的唯一表示形式是旋转,其中最小的数字是最后一个用空格分隔的数字。例如,如果
s = 2 1 4 2 1 4 2 1
循环为4 2 1
。 - 在接下来的每一行中,您应该输出每个唯一循环,而该循环恰好在单词前面
LOOP
。例如LOOP 4 2 1
- 就最后一个元素而言,循环应按升序排列。
- 尾随换行符是可选的。
例子:
前几行是输入,后几行直到输出是空白行。
2 3 1
LOOP 4 2 1
2 2 6
LOOP 8 4 2 1
LOOP 12 6 3
3 7 8
DIVERGENT
LOOP 15 5 43 309 103 729 243 81 27 9 3 1
LOOP 22 162 54 18 6 2
LOOP 36 12 4
3 9 1
DIVERGENT
6 9 9
DIVERGENT
LOOP 18 3 36 6 1
LOOP 27 252 42 7 72 12 2
LOOP 45 414 69 630 105 954 159 1440 240 40 369 3330 555 5004 834 139 1260 210 35 324 54 9 90 15 144 24 4
LOOP 81 738 123 1116 186 31 288 48 8
LOOP 99 900 150 25 234 39 360 60 10
LOOP 126 21 198 33 306 51 468 78 13
10 10 10
LOOP 20 2 30 3 40 4 50 5 60 6 70 7 80 8 90 9 100 10 1
93 91 92
DIVERGENT
LOOP 2185 198927 2139 23
LOOP 4278 46
这是代码高尔夫球,因此最短的参赛作品会获胜。