直接切入正题:
对于一个函数: f ( x ) = a n x n + a n − 1 x n − 1 + a n − 2 x n − 2 + ⋯ + a 1 x + a 0 f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0 f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0
给定 a n , a n − 1 … a 0 a_n, a_{n - 1}\dots a_0 an,an−1…a0 及 x x x,求出 f ( x ) f(x) f(x) 的值。
如题。
输入共两行,第一行为 n n n 及 x x x。
第二行 n + 1 n + 1 n+1 个整数,表示 a n a_n an 到 a 0 a_0 a0。
一行一个整数,表示 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
)
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
a
n
−
2
x
n
−
2
+
⋯
+
a
1
x
+
a
0
f(x) = a_nx^n + a_{n - 1}x^{n - 1} + a_{n - 2}x^{n - 2} + \dots+a_1x + a_0
f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0,我们对它进行一些变形:
f
(
x
)
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
a
n
−
2
x
n
−
2
+
⋯
+
a
1
x
+
a
0
=
(
a
n
x
n
−
1
+
a
n
−
1
x
n
−
2
+
⋯
+
a
1
)
x
+
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
f(x)=anxn+an−1xn−1+an−2xn−2+⋯+a1x+a0=(anxn−1+an−1xn−2+⋯+a1)x+a0
之后不断提公因数 x x x,得到如下式子:
f ( x ) = ( … ( ( a n x + a n − 1 ) x + a n − 2 ) ⋯ + a 1 ) x + a 0 f(x) = (\dots((a_nx + a_{n - 1})x + a_{n-2})\dots+a_1)x + a_0 f(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;
}