题解 | #小L的多项式#

题目分析

阅读可知,题目要求的是根据每次的 求出对应的多项式 的值。

首先,先去理解这个多项式代表的含义。

也就是说计算出每一项的内容再累加求和即可。其中 的值在输入部分会得到,而 则可通过递推的方式进行求解。 ,且 我们可以从 开始不断乘 ,逐个求出 的内容。

核心框架

i64 sum=0;//总和
i64 cf=1;//x^0
for(int i=0;i<=n;i++){
    sum+=a[i]*cf;
    cf=cf*x;
}

每次查询都可通过 的复杂度求出结果, 查询,总体时间复杂度为 ​ 。

另外,由于最终结果需要取模,我们需要提升类型为 long long,并利用同余的性质,在过程中边计算边取模以避免溢出。

代码实现

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1005;
const int M = 998244353;
int a[N];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, m, x;
  cin >> n;
  for (int i = 0; i <= n; i++) {
    cin >> a[i];
  }
  cin >> m;
  for (int i = 1; i <= m; i++) {
    i64 ans = 0;
    cin >> x;
    i64 cf = 1;  // x^0
    for (int j = 0; j <= n; j++) {
      ans += a[j] * cf;  // 累加每一项的内容 a[i]*x^j
      ans %= M;
      cf = cf * x % M;  // 计算x^{j+1}
    }
    cout << ans << " ";
  }
  return 0;
}