【问题标题】:How to calculate the sum of(1+a%m+a^2%m……+a^n%m) [closed]如何计算(1+a%m+a^2%m……+a^n%m)的总和[关闭]
【发布时间】:2013-09-23 09:41:34
【问题描述】:

如何计算(1+a%m+a^2%m……+a^n%m) 的总和,其中 m=k!, 1<=k<=12, n<=10^18。如何计算这个总和。 使用电脑,时间限制为 3 秒。 对不起我的错误

【问题讨论】:

  • 这道题似乎跑题了,因为它是一道数学题。
  • 在 for(i=1; i
  • 提示(a+b)%m = (a%m +b%m)%m 这样你可以减少summands。比想想,如果你真的需要计算每个加法。
  • 我假设a^n mod m 对于m = k!, 1 &lt;= k &lt;= 12 变得相对较快。你测试过这个吗?
  • @EvgenyKluev - 不确定。以原始形式询问整个事情mod m,是的。在这种形式下(请注意,整个金额没有mod m),它并没有真正的帮助。我认为需要有一个模式,或者最后缺少mod m。我认为m 是一个阶乘这一事实也应该在解决方案中使用。

标签: algorithm


【解决方案1】:
1+a+a^2+...+a^n = (1+a+a^2+...+a^n)*(1-a)/(1-a) =
= (1 - a^(n+1))/(1-a)

换句话说,您的表达式可以计算为:

(1 - a^(n+1))/(1-a) % m

或者,以编程形式,

fmod((1-pow(a,n+1))/(1-a), m)

【讨论】:

  • (+1) 太棒了。你能想出m 被限制为阶乘的原因吗?
  • 如果1 - a 没有乘法逆模m 怎么办?对于这么大的n,使用 bignums 不会有效。这很好,但不能解决问题。
  • a=1周围不会有数值问题吗?
  • 是的,它会的。但它可以作为单独的案例计算(微不足道,我可能会补充)
  • 抱歉,“大约 1”是指“接近 1”而不是“在 1”(假设 a 是一个浮点数)。
【解决方案2】:
 sum = 0;
 i = 0;
 while(i <= n){
 sum = sum + math.pow(a,i);
 i++;
 }
 result = sum % m;

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多