【发布时间】:2016-02-19 08:08:30
【问题描述】:
我被这个问题困住了:
给定a、b和c三个 自然数(如 1
我首先想到的是 O(log n) 算法,用于在 n 次方处提高 a。
int acc=1; //accumulator
while(n>0) {
if(n%2==1)
acc*=a;
a=a*a;
n/=2;
}
显然,一些基本的数学运算可能会有所帮助,例如“最后一位”的东西:
Last_digit(2^n) = Last_digit(2^(n%4))
其中 n%4 是除法 n/4 的余数
简而言之,我尝试将这些结合起来,但我无法走上正轨。
真的很感激一些帮助。
【问题讨论】:
-
注意,如果你使用费马小定理和中国剩余定理,你应该可以完全减少这个。换句话说,通过一些数学,你应该能够想出一个 O(1) 的算法。
-
如果您将数字
a提高到越来越大的幂,最后一位数字将开始循环。你能弄清楚如何在不计算所有b^c的情况下确定你在周期中的哪个位置吗? -
@scummy 重点(我认为)是 10 = 2*5 和 2,5 是素数。 CRT 可以让您在给定结果 mod 2 和 mod 5 的情况下找到结果 mod 10
-
@JSQuareD 我想过费马的小定理,但没有任何帮助。我需要搜索中国剩余定理。我还没有考虑过 O(1) 解决方案。非常感谢提示。
-
@user2357112 例如,如果 a=2,找到 (b^c)%4 就足够了。这就是你的意思,不是吗?
标签: math exponentiation