[ABC137F] Polynomial Construction 题解

明明有最厉害最好想的插值做法,怎么没有人写呢。

思路#

考虑 n 个点可以确定一个 n1 次多项式。

如何确定。

li(x)=ji(xxj)(xixj)

可以发现这个多项式在 x=xi 时值为一,在 x=xj(ji) 时值为零。

那么就有:

F(x)=i=0i<nyili(x)

容易发现这个多项式恰好满足上面的条件,当然,这就是拉格朗日插值。

如何得到这个多项式?

可以先求出:

G(x)=(xxi)

发现:

li(x)=G(x)(xxi)ki

其它的是一个常数所以和起来写成 ki 即可。

那么就可以 O(n2) 求解了。

思路#

#include <bits/stdc++.h>
using namespace std;

#define int long long

int mod;

inline int power(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = res * x % mod;
    x = x * x % mod, y /= 2;
  }
  return res;
}

inline vector<int> lagrange(const vector<int> &x, const vector<int> &y) {
  int n = x.size();
  vector<int> a(n + 1, 0), f(n, 0);
  a[0] = 1;
  auto add = [&](int x) {
    for (int j = n; j >= 1; j--)
      a[j] = (a[j - 1] - a[j] * x) % mod;
    a[0] = -a[0] * x % mod;
  };
  for (int i = 0; i < n; i++) add(x[i]);
  for (int i = 0; i < n; i++) {
    if (x[i] == 0) {
      for (int j = 0; j <= n; j++) a[j] = a[j + 1];
      a[n] = 0;
    } else {
      int iv = power(x[i], mod - 2);
      a[0] = -a[0] * iv % mod;
      for (int j = 1; j <= n; j++) {
        a[j] = a[j] - a[j - 1];
        a[j] = -a[j] * iv % mod;
      }
    }
    int s = 1;
    for (int j = 0; j < n; j++)
      if (i != j) s = s * (x[i] - x[j]) % mod;
    s = power(s, mod - 2) * y[i] % mod;
    for (int j = 0; j < n; j++)
      f[j] = (f[j] + a[j] * s) % mod;
    add(x[i]);
  }
  for (int i = 0; i < n; i++) f[i] = (f[i] % mod + mod) % mod;
  return f;
}

signed main() {
  ios::sync_with_stdio(0), cin.tie(0);

  vector<int> a, b, f;

  cin >> mod;
  for (int i = 1, x; i <= mod; i++) {
    cin >> x;
    a.push_back(i - 1);
    b.push_back(x);
  }
  f = lagrange(a, b);
  for (int i = 0; i < mod; i++)
    cout << f[i] << " \n"[i == mod - 1];

  return 0;
}

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/18401399

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(8)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
历史上的今天:
2022-09-07 CF1305F Kuroni and the Punishment 题解
2022-09-07 CF1515E Phoenix and Computers 题解
2022-09-07 P5999 [CEOI2016] kangaroo 题解
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示