有几种方法可以处理字符串轮换 “Programming Pearls”深入讨论字符串轮换,有三种线性算法。(点击here进行检查)
第一个被称为“杂耍算法”,我花了很多时间研究它,但我仍然无法理解 Great Common Divisor 在其中扮演的角色。任何人都可以详细解释一下吗?
答案 0 :(得分:3)
通过以d
为步长移动元素来旋转元素。此过程在一定数量的移动后循环回来,因此您需要总共应用m
个长度为l=n/m
的周期。
l
是解决等式l.d = 0 (mod n)
的第一个值,因此m
正好是gcd(n, d)
。
Example 1: for n=12, d=3, 3 cycles of length 4:
0 3 6 9
1 4 7 10
2 5 8 11
Example 2: for n=12, d=10, 2 cycles of length 6:
0 10 8 6 4 2
1 11 9 7 5 3
答案 1 :(得分:1)
感谢您的解释!但是,对我来说,你可以跳到结论
并不是很直观M = GCD(N,d)
,所以我只想在这里分享我的推理:
因为你想找到这样的最小值
((n/m)*d)%n == 0
,这意味着您希望找到能够满足此要求的最大m
。从m = n
开始,您可以逐个尝试,并在m=gcd(n,d)
满足等式时发现。这是因为:(n/m)*d = (n/m)*((d/m)*m) = n*(d/m)
。我们需要确保d/m
和n/m
都是有效整数,并且对于m
这样的最大值,必须是m=gcd(n,d)
的情况。