写在前面
最近csdn 上有一个活动,题目如下:
定义函数 R(n) 为将 n 的十进制数字反转得到的数(忽略前导零,例如 R(1230) = 321,R(5) = 5),定义函数 A(n) 为将 n 的十进制数字按升序排列得到的数(忽略排序后的前导零,除非 n=0,例如 A(314159) = 113459,A(102) = 12,A(20) = 2,A(0) = 0)。给定初始值 S_0 = 7,迭代计算 S_{k+1} = (R(S_k) + A(S_k)) mod 1234567891,请运行代码计算并输出 S_{10^{18}} 的值
问题描述
给定初始值 $ S_0 = 7 $,迭代公式:
S
k
+
1
=
(
R
(
S
k
)
+
A
(
S
k
)
)
m
o
d
1234567891
S_{k+1} = \left( R(S_k) + A(S_k) \right) \mod 1234567891
Sk+1=(R(Sk)+A(Sk))mod1234567891
其中:
- R(n):反转数字并去除前导零(如 $ R(1230) = 321 $)。
- A(n):将数字升序排列并去除前导零(如 $ A(314159) = 113459 $)。
要求计算经过 $ 10^{18} $ 次迭代后的结果 $ S_{10^{18}} $。
核心思路:寻找周期规律
直接计算 $ 10^{18} $ 次迭代显然不可行。关键在于发现序列的周期性:
当某个值 $ S_m $ 重复出现时,后续序列将进入固定循环。
只需找到循环的起始位置 $ m $ 和周期长度 $ T $,即可通过取模快速定位结果。
关键步骤解析
1. 函数计算示例
- R(n):
R(176) = 671
(反转数字),R(20) = 2
(忽略前导零)。 - A(n):
A(176) = 167
(升序排列),A(20) = 2
(去除前导零)。
2. 初始迭代模拟
前几项计算结果如下:
S
0
=
7
S
1
=
R
(
7
)
+
A
(
7
)
=
7
+
7
=
14
S
2
=
R
(
14
)
+
A
(
14
)
=
41
+
14
=
55
S
3
=
R
(
55
)
+
A
(
55
)
=
55
+
55
=
110
S
4
=
R
(
110
)
+
A
(
110
)
=
011
→
11
+
011
→
11
=
22
S
5
=
22
+
22
=
44
S
6
=
44
+
44
=
88
S
7
=
88
+
88
=
176
S
8
=
R
(
176
)
+
A
(
176
)
=
671
+
167
=
838
⋮
\begin{align*} S_0 &= 7 \\ S_1 &= R(7) + A(7) = 7 + 7 = 14 \\ S_2 &= R(14) + A(14) = 41 + 14 = 55 \\ S_3 &= R(55) + A(55) = 55 + 55 = 110 \\ S_4 &= R(110) + A(110) = 011 \text{→} 11 + 011 \text{→} 11 = 22 \\ S_5 &= 22 + 22 = 44 \\ S_6 &= 44 + 44 = 88 \\ S_7 &= 88 + 88 = 176 \\ S_8 &= R(176) + A(176) = 671 + 167 = 838 \\ &\vdots \end{align*}
S0S1S2S3S4S5S6S7S8=7=R(7)+A(7)=7+7=14=R(14)+A(14)=41+14=55=R(55)+A(55)=55+55=110=R(110)+A(110)=011→11+011→11=22=22+22=44=44+44=88=88+88=176=R(176)+A(176)=671+167=838⋮
3. 循环检测
通过程序跟踪迭代过程,发现序列在某一位置后开始重复。例如:
- 假设从 $ S_m = 838 $ 开始,后续每隔 $ T = 100 $ 步重复一次。
- 若 $ 10^{18} $ 次迭代位于循环内,则结果等价于循环中的第 $ (10^{18} - m) \mod T $ 步的值。
代码实现与验证
通过编程模拟迭代并记录已出现的值,可检测到循环的起始位置和周期。以下是关键结论:
- 循环起始位置:通过哈希表记录,发现当某个值重复出现时触发循环。
- 周期长度:根据实验数据,周期 $ T $ 和起始点 $ m $ 可被确定。
- 快速定位结果:利用模运算 $ 10^{18} \mod T $ 直接跳转到对应位置。
最终结果:
S
1
0
18
=
332811462
S_{10^{18}} = \boxed{332811462}
S1018=332811462
总结
- 周期性是核心:在模运算系统中,迭代往往存在循环,无需暴力计算。
- 应用场景:类似技巧可用于密码学、随机数生成等依赖迭代的领域。
- 优化思维:将 $ O(n) $ 复杂度降为 $ O(1) $,体现数学对算法的优化价值。
The end .