系列之和:a ^ 0 + 2a ^ 1 + 3 * a ^ 2 + 4 * a ^ 3 + ... + n * a ^(n-1)(mod M)

时间:2016-10-17 10:19:11

标签: c++ algorithm number-theory

有人可以让我知道一个有效的大n算法,它使用递归函数而不是几何求和公式来执行O(log(n))。

2 个答案:

答案 0 :(得分:4)

您需要使用几何级数之和的公式:a^1 + a^2 + ... a^n = (a^(n+1) - 1) / (a - 1)。使用exponentiation by squaring,您可以在O(log(n))中计算(a ^(n + 1) - 1)。如果M是素数除以(a - 1)则只是一个幂数 - 对于具有素数p的任何U互质,U^(-1) (mod p) = U^(p-2) (mod p)。您可以使用Fermat's little theorem来证明这一点。

答案 1 :(得分:0)

首先,当你陈述 M< 10 5 ,你知道所有数字都需要最多16位,所以只要稍微谨慎一点,你就不应该被精确问题所困扰。

接下来,作为 a n (mod M)=(a(mod M)) n (mod M),你也可以说 a< M< 10< 10 5

接下来,如果你注意到你的 n = a 0 + a 1 ... a n-1 (mod M),您可以使用以下递归:

  • u 2k = u k + a k u k (mod M)
  • u k + 1 = u k + a k (mod M)
  • u 2k + 1 = u k + 1 + a k + 1 u k (mod M )= u k + a k + a * a k u k (mod M)

给定数n,你会发现log 2 (n)数n,n / 2,n / 4,...,1并使用上面的公式,你可以轻松计算u n / 2 i n / 2 i 知道u n / 2 i + 1 n / 2 i + 1

这个算法可能并不容易写(特别是不要忘记mod M操作确实没有溢出)因为测试不同,但是 O(log 2 (n))的