拉格朗日插值
CSR:又拉又插的东西(又垃圾,又傻叉)
JCY:什么你拉插了一晚上?(我学习拉插学了一晚上)
什么是拉插
给定一些点值,是否可以求出一个函数,使得函数图像穿过这些点,并求出给定的
初步思路
前置
我们想到两个点肯定可以确定一条直线,而三个点肯定可以确定一条抛物线,所以我们猜测
正文:构造
考虑到我们可以强行让
我们也可以将其理解为构造出来一个
CF622F The Sum of the k-th Powers
首先我们要证明
#include <iostream> using namespace std; using ll = long long; const int MaxN = 1e6 + 10, mod = 1e9 + 7; ll f[MaxN], pr[MaxN], pl[MaxN], y[MaxN], n, k, ans, sum = 1; ll qpow(ll a, ll b) { ll res = 1; for (ll i = 1; i <= b; i <<= 1) { (b & i) && (res = res * a % mod); a = a * a % mod; } return res; } int main() { cin >> n >> k, f[0] = pl[0] = pr[k + 3] = 1; for (int i = 1; i <= k + 2; i++) { f[i] = f[i - 1] * i % mod, sum = sum * (n - i) % mod; pl[i] = pl[i - 1] * (n - i) % mod; } for (int i = k + 2; i >= 1; i--) { pr[i] = pr[i + 1] * (n - i) % mod; } for (int i = 1; i <= k + 2; i++) { y[i] = (y[i - 1] + qpow(i, k)) % mod; } for (int i = 1; i <= k + 2; i++) { ll a = pl[i - 1] * pr[i + 1] % mod, b = f[i - 1] * f[k + 2 - i] % mod * ((k + 2 - i) % 2 ? -1 : 1) % mod; ans = (ans + a * qpow(b, mod - 2) % mod * y[i] % mod) % mod; } cout << (ans % mod + mod) % mod << endl; return 0; }
P4463 [集训队互测 2012] calc
这个首先得出 dp 式子(什么,这个不知道你学拉插干什么?):
设
那么我们可以得到 \(g_i = g_{i - 1) + 2\)
所以
所以我们便知道
#include <iostream> using namespace std; using ll = long long; const int MaxN = 2e3 + 10; ll f[MaxN][MaxN], a[MaxN], b[MaxN], n, k, p, mod, ans, sum = 1; ll qpow(ll a, ll b) { ll res = 1; for (ll i = 1; i <= b; i <<= 1) { (b & i) && (res = res * a % mod); a = a * a % mod; } return res; } int main() { cin >> k >> n >> p, mod = p; for (int i = 0; i <= 2 * n + 1; i++) { f[0][i] = 1; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= 2 * n + 1; j++) { f[i][j] = (f[i - 1][j - 1] * j % mod + f[i][j - 1]) % mod; } } for (int i = 1; i <= 2 * n + 1; i++) { a[i] = i; } for (int i = 1; i <= 2 * n + 1; i++) { b[i] = f[n][i]; sum = 1; for (int j = 1; j <= 2 * n + 1; j++) { if (i != j) sum = ((sum * (k - a[j]) % mod) + mod) % mod, sum = sum * (qpow(((a[i] - a[j]) % mod + mod) % mod, mod - 2)) % mod; } ans = (ans + sum * b[i] % mod) % mod; } for (int i = 1; i <= n; i++) { ans = ans * i % mod; } cout << ans << endl; return 0; }
本文作者:yabnto
本文链接:https://www.cnblogs.com/ybtarr/p/18401931
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步