【ybt金牌导航8-3-2】数列求值

数列求值

题目链接:ybt金牌导航8-3-2

题目大意

给出一个不超过 m-1 次的函数,给出 x 为 0~m-1 时 y 的值,然后求 x 为 k 时 y 的值。

思路

这一题看到函数自然会想到拉格朗日插值法。

但是你会看到它的范围很大,n2 是过不了的。

但是你会发现它有一个特殊的地方:给出的点是连续的,而且 xi=i

那你考虑能不能化简式子。
先把式子拿出来:
f(k)=i=1n(yiijkxjxixj)
然后 xi=i
f(k)=i=1n(yiijkjij)
那累乘的不等号条件很烦,我们就把它分开乘两个累乘:
f(k)=i=1n(yi1j<ikjiji<jnkjij)
那这里我们就发现它分子的部分分别是可以用前缀积和后缀积解决。

然后再看分母,你会发现它是两个阶乘。

那你就预处理这三个东西,就可以用了。

在处理阶乘的时候,我们可以预先把它的逆元算出来。
然后不要一个一个都转逆元,会 T,你可以求出最大的那个的逆元,然后每次再乘回去,就可以得到较小的阶乘的逆元了。

还有。
不要以为我的题意写错了。
给出的就是从 0m1 的,题目是有问题的,连样例都错了。
正确的样例输出的应该是 9,而不是 7

然后我这里因为是后面才发现,就把它改成了从 0 开始记录数组,运算什么的。
上面的公式的循环范围也要小改一下,这里就不再写一次了。
(如果不知道怎么改可以看代码)

代码

#include<cstdio> #define ll long long #define mo 998244353 using namespace std; ll m, k, a[1000001]; ll y[1000001]; ll q[1000001], b[1000001]; ll jc[1000001], ans, now; ll ksm(ll x, ll y) {//快速幂求逆元 if (x < 0) x = (x % mo + mo) % mo; ll re = 1; while (y) { if (y & 1) re = (re * x) % mo; x = (x * x) % mo; y >>= 1; } return re; } int main() { scanf("%lld %lld", &m, &k); m--; q[0] = k - 0; scanf("%d", &y[0]); for (ll i = 1; i <= m; i++) { scanf("%lld", &y[i]); q[i] = q[i - 1] * ((k - i + mo) % mo) % mo;//处理分子的前缀积 } b[m + 1] = 1ll; for (ll i = m; i >= 0; i--) {//处理分子的后缀积 b[i] = b[i + 1] * ((k - i + mo) % mo) % mo; } jc[0] = 1ll;//求分母的阶乘 for (ll i = 1; i <= m; i++) jc[i] = jc[i - 1] * i % mo; jc[m] = ksm(jc[m], mo - 2);//现在就把分母的阶乘的逆元弄好 for (ll i = m - 1; i >= 0; i--) jc[i] = (jc[i + 1] * (i + 1)) % mo;//不要每个都求逆元,会T for (ll i = 0; i <= m; i++) { now = y[i];//按照公式乘 now = (now * (((i - 1 < 0) ? 1 : q[i - 1]) * b[i + 1] % mo)) % mo; now = (now * (jc[i] * jc[m - i] % mo)) % mo; now = (now * ((m - i) & 1 ? -1 : 1)) % mo; if (now < 0) now += mo; ans = (ans + now) % mo; } printf("%lld", ans); return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/YBT_JPDH_8-3-2.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示