直接切入正题:
对于一个函数:f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0
给定 an,an−1…a0a_n, a_{n - 1}\dots a_0an,an−1…a0 及 xxx,求出 f(x)f(x)f(x) 的值。
如题。
输入共两行,第一行为 nnn 及 xxx。
第二行 n+1n + 1n+1 个整数,表示 ana_nan 到 a0a_0a0。
一行一个整数,表示 f(x)f(x)f(x)。
3 2
1 2 3 4
26
#include
#include
#include
#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;
}
对于这个式子: f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0,我们对它进行一些变形:
f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0=(anxn−1+an−1xn−2+⋯+a1)x+a0f(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_0f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0=(anxn−1+an−1xn−2+⋯+a1)x+a0
之后不断提公因数 xxx,得到如下式子:
f(x)=(…((anx+an−1)x+an−2)⋯+a1)x+a0f(x) = (\dots((a_nx + a_{n - 1})x + a_{n-2})\dots+a_1)x + a_0f(x)=(…((anx+an−1)x+an−2)⋯+a1)x+a0,
这就是 秦九韶算法。
代码实现:
#include
#include
#include
#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;
}