【问题标题】:Reduce execution time (pow function)减少执行时间(pow 函数)
【发布时间】:2020-09-25 08:57:20
【问题描述】:

我想在代码中实现以下formula,但由于超出时间限制我无法实现,谁能帮我减少执行时间?

我尝试在 c++ 中使用它:

#include <bits/stdc++.h>
int main(){
    int n;
    long long ans = 0;
    std::cin >> n;
    for(int i=n-1; i>0;--i){
        ans += -pow(-1.0,(n-i))*pow(3.0,i);
    }
    std::cout << ans << std::endl;
}

ps:这个公式是针对以下问题的:https://codeforces.com/contest/166/problem/E

【问题讨论】:

  • 首先,不要使用&lt;bits...&gt; 标头,因为它不是标准的。二、n的值是多少?
  • 看第一个词。 -1 ^ (n-i)。从 1 开始。-1^1 是什么? -1^2 怎么样? -1^3? -1^4?开始注意到一种模式?如果不继续,你会看到它。一旦你注意到这种模式,有比使用 pow 函数更快的方法来找出答案。
  • Delta_G 为您指明了正确的方向,但为了将来参考,pow 可能会变得昂贵。如今,许多编译器和标准库实现都足够聪明,可以走捷径,但是当它们不能走捷径时,您的简单整数指数将沿着用于计算真正讨厌的东西(例如 e 到 pi 的幂)的相同路径。这真的很慢。此外,它使用浮点数学并且可以给出不精确的结果。当您将结果填充为整数时,您可能会得到一个不太好的 9.9999999,而不是一个不错的 10,它会变成 9。乘法更安全、更好。
  • @Delta_G 我尝试删除“-pow(-1.0,(n-i))”部分并改用其他东西,这减少了执行时间,但现在当我输入大约大于 50 输出开始出现 -291172004 ??
  • 你改成的肯定是错的。很难说,因为我看不到它。

标签: c++ time time-complexity


【解决方案1】:

系列的每个成员都给出,以i为索引:

s_i = - (-1)^i * 3^(n-i) =
    = - (-1)^i * 3^n * 3^(-i) =
    = - 3^n * (-1)^i * 3^(-i) =
    = - 3^n * (-1)^i * 1 / (3^i) =
    = - 3^n * (-1/3)^i

这是一个几何级数,sum of first n elements geometric series 是:

a = -3^n
r = -1/3
sum = a * (( 1 - r^n ) / ( 1 - r ))

计算一下:

const double a = -pow(3.0, n)
const double r = -1.0/3.0;
const double ans = a * (( 1.0 - pow(r, n) ) / ( 1.0 - r ));

这还不是全部,因为我们是从第一个 k=1 元素而不是零元素求和,所以结果不正确,这留给读者找出必须做的事情和纠正.. .

不要逃学

【讨论】:

  • 我确实注意到它是一个 gp ......只是我想避免使用 pow 函数,因为它会增加执行时间,我要求一些替代更快的方法而不使用 pow。
  • 而且对输出的限制是它必须是一个 int,所以我避免使用它,因为它以双精度输出。
  • pow 中的指数是一个 int - 只需按照 int powi(int x, int b) { int r = x; while (b--) r*=x; return r; } 实现您自己的东西,不要使用浮点数。
  • 我知道,但这仍然会占用执行时间....我要求另一种方法来执行此操作....感谢您在答案末尾的有用评论我'从现在开始不再逃学
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多