列表

详情


NC219627. 多项式求导与积分

描述

总所周知多项式是ACM竞赛中较难的一个知识点,所以这里就以多项式为背景来考考你们了。

给定一个n次多项式,可被描述为

我们有两种基本操作,求k阶导或求k阶积分。

输入描述

第一行输入两个数 

第二行输入n+1个数, 表示一个n次多项式。

如果op = 1,则我们要对这个多项式求k阶导,否则我们要对这个多项式求k阶积分。

第三行输入一个整数,接下来T行,每行输入一个

输出描述

假设我们求导或积分后的多项式为g(x), 对每个x_i输出g(x_i)的值,每个输出占一行。

上面所有答案对100000007取模。

示例1

输入:

3 2 1
1 2 3 4
1
1

输出:

30

说明:

f(x) = 1 + 2 x + 3 x ^{2} + 4x ^{3},对其求两次导数g(x) = 6 + 24x ^{}

示例2

输入:

3 1 2
1 2 3 4
1
1

输出:

4

说明:

f(x) = 1 + 2 x ^{} + 3 x^{2} + 4 x ^{3},对其求一次积分g(x) = x + x ^{2} + x ^{3} + x^{4}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 311ms, 内存消耗: 23804K, 提交时间: 2021-03-16 22:12:54

#include <bits/stdc++.h>

using namespace std;

const int N = 2e6 + 10, mod = 100000007;

int a[N], b[N], fac[N], ifac[N], n, k, op;

int quick_pow(int a, int n) {
  int ans = 1;
  while (n) {
    if (n & 1) {
      ans = 1ll * a * ans % mod;
    }
    a = 1ll * a * a % mod;
    n >>= 1;
  }
  return ans;
}

void init() {
  fac[0] = 1;
  for (int i = 1; i < N; i++) {
    fac[i] = 1ll * i * fac[i - 1] % mod;
  }
  ifac[N - 1] = quick_pow(fac[N - 1], mod - 2);
  for (int i = N - 2; i >= 0; i--) {
    ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod;
  }
}

void solve1() {
  for (int i = 0; i <= n - k; i++) {
    b[i] = 1ll * a[i + k] * fac[i + k] % mod * ifac[i] % mod;
  }
  int T, x;
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &x);
    int ans = 0;
    for (int i = n - k; i >= 0; i--) {
      ans = (1ll * ans * x % mod + b[i]) % mod;
    }
    printf("%d\n", ans);
  }
}

void solve2() {
  for (int i = k; i <= n + k; i++) {
    b[i] = 1ll * a[i - k] * fac[i - k] % mod * ifac[i] % mod;
  }
  int T, x;
  scanf("%d", &T);
  while (T--) {
    scanf("%d", &x);
    int ans = 0;
    for (int i = n + k; i >= 0; i--) {
      ans = (1ll * ans * x % mod + b[i]) % mod;
    }
    printf("%d\n", ans);
  }
}

int main() {
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  // ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  init();
  scanf("%d %d %d", &n, &k, &op);
  for (int i = 0; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  if (op == 1) {
    solve1();
  }
  else {
    solve2();
  }
  return 0;
}

上一题