当前位置: 首页 > news >正文

Educational Codeforces Round 7 F. The Sum of the k-th Powers 多项式、拉格朗日插值

题目链接

题目大意

( ∑ i = 1 n i k ) (\sum_{i=1}^{n} i^k) (i=1nik) m o d ( 1 0 9 + 7 ) mod(10^9+7) mod(109+7) .
数据范围 : 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1n109 , 0 ≤ k ≤ 1 0 6 0 \leq k \leq 10^6 0k106 .

思路

f ( n ) = ∑ i = 1 n = 1 k + 2 k + ⋅ ⋅ ⋅ + n k f(n)=\sum_{i=1}^n=1^k+2^k+ \cdot \cdot \cdot +n^k f(n)=i=1n=1k+2k++nk.

观察题面可以发现,所求的答案是一个 k + 1 k+1 k+1 次多项式,我们只需要找 k + 2 k+2 k+2 个点带入拉格朗日插值公式中就可以计算出 f ( n ) f(n) f(n) .

n + 1 n+1 n+1 组点值 ( x i , y i ) (x_i,y_i) (xi,yi) ,得到的 n n n 次多项式 f ( n ) f(n) f(n) 的拉格朗日插值的方法为 : f ( x ) = ∑ i = 0 n y i ∏ j ≠ i x − x j x i − x j f(x)=\sum_{i=0}^n y_i \prod_{j \neq i} \frac {x-x_j}{x_i-x_j} f(x)=i=0nyij=ixixjxxj .

如果按照这个公式代进去硬算时间复杂度 O ( n 2 ) O(n^2) O(n2) ,但我们可以选 k + 2 k+2 k+2 个连续的点对这个式子进行简化。

我们把 1 1 1 k + 2 k+2 k+2 代入,对于分子, ( n − 1 ) ( n − 2 ) ⋅ ⋅ ⋅ ( n − ( i − 1 ) ) (n-1)(n-2) \cdot \cdot \cdot (n-(i-1)) (n1)(n2)(n(i1)) 乘与 ( n − ( k + 2 ) ) ( n − ( k + 1 ) ) ⋅ ⋅ ⋅ ( n − ( i + 1 ) ) (n-(k+2))(n-(k+1)) \cdot \cdot \cdot (n-(i+1)) (n(k+2))(n(k+1))(n(i+1)) ,这个可以 O ( k + 2 ) O(k+2) O(k+2) 预处理出来前缀积和后缀积, O ( 1 ) O(1) O(1) 取用;对于分母是 1 1 1 乘到 ( i − 1 ) (i-1) (i1) 再乘上 − 1 -1 1 乘到 ( − ( k + 2 − i ) (-(k+2-i) ((k+2i) ,可以 O ( k + 2 ) O(k+2) O(k+2)内预处理出 1 1 1 k + 2 k+2 k+2 阶乘的逆元, O ( 1 ) O(1) O(1) 取用。

code

#include <bits/stdc++.h>
#define int long long
#define ll long long
#define pii pair<int, int>

using namespace std;
const int N = 1e6 + 1000, mod = 1e9 + 7;
int pre[N], suf[N], infac[N];

int ksm(int x, int k)
{
    int res = 1;
    while (k > 0)
    {
        if (k & 1)
            res = res * x % mod;
        x = x * x % mod;
        k >>= 1;
    }
    return res;
}

int inv(int x)
{
    return ksm(x, mod - 2);
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n, k;
    cin >> n >> k;
    pre[0] = suf[k + 3] = infac[0] = 1;
    int fac = 1;
    for (int i = 1; i <= k + 2; ++i)
    {
        pre[i] = pre[i - 1] * (n - i) % mod;
        fac = fac * i % mod;
    }
    infac[k + 2] = inv(fac);
    for (int i = k + 2; i >= 1; --i)
    {
        suf[i] = suf[i + 1] * (n - i) % mod;
        if (i < k + 2)
            infac[i] = infac[i + 1] * (i + 1) % mod;
    }
    int y = 0, ans = 0;
    for (int i = 1; i <= k + 2; ++i)
    {
        y = (y + ksm(i, k)) % mod;
        int tmp1 = pre[i - 1] * suf[i + 1] % mod;
        int tmp2 = infac[i - 1] * (((k + 2 - i) & 1) ? mod - infac[k + 2 - i] : infac[k + 2 - i]) % mod;
        ans = (ans + y * tmp1 % mod * tmp2 % mod) % mod;
    }
    cout << (ans + mod) % mod << '\n';
    return 0;
}

相关文章:

  • 浏览器信息收集插件之 雪瞳 —— 洞悉无形,守护无界
  • 标量、向量、矩阵与张量:从维度理解数据结构的层次
  • 攻防世界web:NewsCenter(含sqlmap基本参数讲解)
  • 水管滴水漏水检测数据集VOC+YOLO格式2708张1类别
  • MongoDB winx64 msi包安装详细教程
  • 子数组、子串系列(典型算法思想)—— OJ例题算法解析思路
  • Vue3、vue学习笔记
  • 【STM32MP157系统移植】2.烧录TF-A到EMMC
  • KUKA机器人导轨介绍
  • Matlab:矩阵运算篇——矩阵数学运算
  • Codeforces Round 502 E. The Supersonic Rocket 凸包、kmp
  • vue3项目中接入高德地图组件。
  • SV学习笔记——数组、队列
  • ​​《从事件冒泡到处理:前端事件系统的“隐形逻辑”》
  • 【Java代码审计 | 第十三篇】XXE漏洞成因及防范
  • 数据结构第六节:AVL树(初阶)
  • API调试工具的无解困境:白名单、动态IP与平台设计问题
  • STM32基础教程——对射式红外传感器计数实验
  • java读取Markdown配置文件
  • 【2025前端高频面试题——系列二之vue生命周期:vue2/vue3】
  • 7k网站怎么做/百度竞价排名算法
  • 东莞个人网站设计/微信指数查询
  • wordpress怎么添加二级链接/淘宝seo排名优化的方法
  • 武汉网站建设jk/手机优化大师怎么退款
  • 网站建设前言/网络营销推广方案策划书
  • 定制营销型网站公司/长沙百度seo