Processing math: 100%

「CF622F」The Sum of the k-th Powers「拉格朗日插值」

题意

ni=1ikn109,k106

题解

观察可得答案是一个k+1次多项式,我们找k+2个值带进去然后拉格朗日插值

n+1组点值(xi,yi),得到n次多项式f的拉格朗日插值方法:

f(x)=ni=0yijixxjxixj

时间复杂度为O(n2).

现在考虑这题,我们把1k+2带入,有很好的性质:对于每个i,分母是1乘到i1再乘上1乘到ik2,这可以预处理阶乘O(1)处理。分子可以预处理前后缀积来O(1)得到

于是时间复杂度为O(n),可以通过

#include <algorithm>
#include <cstdio>
using namespace std;

const int mo = 1e9 + 7;
const int N = 1e6 + 10;

int pl[N], pr[N], fac[N];

int qpow(int a, int b) {
    int ans = 1;
    for(; b >= 1; b >>= 1, a = 1ll * a * a % mo)
        if(b & 1) ans = 1ll * ans * a % mo;
    return ans;
}

int main() {
    int n, k, y = 0, ans = 0;
    scanf("%d%d", &n, &k);
    pl[0] = pr[k + 3] = fac[0] = 1;
    for(int i = 1; i <= k + 2; i ++)
        pl[i] = 1ll * pl[i - 1] * (n - i) % mo;
    for(int i = k + 2; i >= 1; i --)
        pr[i] = 1ll * pr[i + 1] * (n - i) % mo;
    for(int i = 1; i <= k + 2; i ++)
        fac[i] = 1ll * fac[i - 1] * i % mo;
    for(int i = 1; i <= k + 2; i ++) {
        y = (y + qpow(i, k)) % mo;
        int a = pl[i - 1] * 1ll * pr[i + 1] % mo;
        int b = fac[i - 1] * ((k - i) & 1 ? -1ll : 1ll) * fac[k + 2 - i] % mo;
        ans = (ans + 1ll * y * a % mo * qpow(b, mo - 2) % mo) % mo;
    }
    printf("%d\n", (ans + mo) % mo);
    return 0;
}

本文作者:hfhongzy

本文链接:https://www.cnblogs.com/hongzy/p/10371638.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hfhongzy  阅读(248)  评论(0编辑  收藏  举报
编辑推荐:
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起