巧用循环周期:1e18次迭代的秒解之道

写在前面

最近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)=01111+01111=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


总结

  1. 周期性是核心:在模运算系统中,迭代往往存在循环,无需暴力计算。
  2. 应用场景:类似技巧可用于密码学、随机数生成等依赖迭代的领域。
  3. 优化思维:将 $ O(n) $ 复杂度降为 $ O(1) $,体现数学对算法的优化价值。

The end .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值