【发布时间】: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
【问题讨论】:
-
首先,不要使用
<bits...>标头,因为它不是标准的。二、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