秦九韶算法

· · 个人记录

直接切入正题:

对于一个函数:f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0

给定 a_n, a_{n - 1}\dots a_0x,求出 f(x) 的值。

题目描述

如题。

输入格式

输入共两行,第一行为 nx

第二行 n + 1 个整数,表示 a_na_0

输出格式

一行一个整数,表示 f(x)

样例输入

3 2
1 2 3 4

样例输出

26

算法分析:

  1. 普通算法

直接暴力求解,程序如下:

#include <cmath>
#include <iostream>
#include <algorithm>
#define L unsigned long long
#define ll long long
#define I unsigned int
#define endl '\n'
#define ref(i, a, b, p) for (signed(i) = (a); (i) <= signed(b); (i) += signed(p))
#define gef(i, a, b, p) for (signed(i) = (a); (i) >= signed(b); (i) -= signed(p))
using namespace std;

int a[1005], x, n;
ll ans;

void work()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> x;
    gef (i, n, 0, 1)
        cin >> a[i];
    ref (i, 0, n, 1)
        ans += a[i] * pow(x, i);    // 如题,直接计算即可
    cout << ans << endl;

    return ;
}

int main()
{
    work();

    return 0;
}
  1. 秦九韶算法

对于这个式子: f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0,我们对它进行一些变形:

f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0$ $\qquad\;=(a_nx^{n - 1} + a_{n - 1}x^{n - 2} + \dots + a_1)x + a_0

之后不断提公因数 x,得到如下式子:

这就是 **秦九韶算法**。 代码实现: ```cpp #include <cmath> #include <iostream> #include <algorithm> #define L unsigned long long #define ll long long #define I unsigned int #define endl '\n' #define ref(i, a, b, p) for (signed(i) = (a); (i) <= signed(b); (i) += signed(p)) #define gef(i, a, b, p) for (signed(i) = (a); (i) >= signed(b); (i) -= signed(p)) using namespace std; int a[1005], x, n; ll ans; void work() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> x; gef(i, n, 0, 1) cin >> a[i]; ans = a[n]; gef(i, n, 1, 1) ans = ans * x + a[i - 1]; cout << ans << endl; return; } int main() { work(); return 0; } ```