题意

求 $ \displaystyle \sum_{i=1}^n i^k \ mod (1e9+7), n \leq 10^9, k \leq 10^6$.

CF622F

分析

易知答案是一个 $k+1$ 次多项式,我们找 $k+2$ 个值代进去,然后拉格朗日插值。

$n+1$ 组点值对 $(x_i, y_i)$,得到 $n$ 次多项式 $f$ 的拉格朗日插值公式为:

$$f(x) = \sum_{i = 0}^n y_i\prod_{j\not =i} \frac{x-x_j}{x_i-x_j}$$

时间复杂度为 $O(n^2)$,

如果我们取 $n$ 个连续的值,这样可以预处理阶乘,复杂度降至 $O(n)$,

在这题中复杂度为 $O(k log{mod})$,其中 $O(log mod)$为求逆元的时间。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll mod = 1e9 + ;
const int maxk = + ;
ll n, k; ll qpow(ll m, ll n, ll mod)
{
ll res = ;
while (n > )
{
if (n & )
res = (res * m) % mod;
m = (m * m) % mod;
n = n >> ;
}
return res;
} ll fac[maxk], y[maxk]; //前k+2项前缀和都已经算好
ll Largrange()
{
fac[]=fac[]=,y[]=;
for(int i=;i<=k+;i++) fac[i]=fac[i-]*i%mod; //预处理阶乘
for(int i=;i<=k+;i++) y[i]=(y[i-]+qpow(i,k, mod))%mod; //预处理求出每一项的结果
if(n<=k+) return y[n];
ll ans = , prod = , sig;
for(ll i = n-k-; i <= n-;i++) prod = prod * i % mod;
for(ll i = ;i <= k+;i++)
{
ll fz = prod * qpow(n-i, mod-, mod) % mod;
ll fm = qpow(fac[i-] * fac[k+-i] % mod, mod-, mod);
if((k+-i) % == ) sig = ;
else sig = -;
ans = (ans + sig*y[i]*fz%mod*fm%mod + *mod) % mod;
}
return ans;
;} int main()
{
scanf("%lld%lld", &n, &k);
printf("%lld\n", Largrange()); return ;
}

 
预处理逆元阶乘,此时时间复杂度的瓶颈在求前 $k+2$ 项和,所以总的时间复杂度为 $O(klogk)$。
 
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll mod = 1e9 + ;
const int maxk = 5e4 + ;
ll n, k; ll qpow(ll m, ll n, ll mod)
{
ll res = ;
while (n > )
{
if (n & )
res = (res * m) % mod;
m = (m * m) % mod;
n = n >> ;
}
return res;
} ll inv[maxk], fac[maxk]; //阶乘的逆元
void init()
{
inv[] = ;
for(int i = ;i < maxk; i++) inv[i] = (mod - mod / i) * inv[mod % i] % mod; //加mod不改变结果 fac[] = ;
for(int i=;i< maxk; i++) fac[i]=fac[i-]*inv[i]%mod; //预处理阶乘
} ll y[maxk]; //前 k+2 项自然数 k 次幂和 也就是yi
ll pre[maxk], suf[maxk]; //前缀积 后缀积
ll Largrange()
{
y[] = ;
for(int i=;i<=k+;i++) y[i]=(y[i-]+qpow(i,k, mod))%mod; //预处理求出每一项的结果
if(n<=k+) return y[n]; n %= mod; //因为最后是关于n的多项式
ll ans = ;
pre[] = suf[k+] = ; //边界
for(ll i = ;i <= k+;i++) pre[i] = pre[i-] * (n - i) % mod;
for(ll i = k+;i >= ;i--) suf[i] = suf[i+] * (n - i) % mod;
for(ll i = ;i <= k+;i++)
{
ll f = fac[i-] * fac[k+-i] % mod;
f = (k+-i)& ? -f : f;
ans = (ans + y[i]*f%mod * pre[i-]%mod * suf[i+]%mod + mod) % mod;
}
return ans;
;} int main()
{
init(); int T;
scanf("%d", &T);
while(T--)
{
scanf("%lld%lld", &n, &k);
printf("%lld\n", Largrange());
} return ;
}
 
参考链接:

CF622F——自然数幂和模板&&拉格朗日插值的更多相关文章

  1. Codeforces 622F The Sum of the k-th Powers ( 自然数幂和、拉格朗日插值法 )

    题目链接 题意 : 就是让你求个自然数幂和.最高次可达 1e6 .求和上限是 1e9 分析 :  题目给出了最高次 k = 1.2.3 时候的自然数幂和求和公式 可以发现求和公式的最高次都是 k+1 ...

  2. 51Node1228序列求和 ——自然数幂和模板&&伯努利数

    伯努利数法 伯努利数原本就是处理等幂和的问题,可以推出 $$ \sum_{i=1}^{n}i^k={1\over{k+1}}\sum_{i=1}^{k+1}C_{k+1}^i*B_{k+1-i}*(n ...

  3. 【BZOJ】3453: tyvj 1858 XLkxc 拉格朗日插值(自然数幂和)

    [题意]给定k<=123,a,n,d<=10^9,求: $$f(n)=\sum_{i=0}^{n}\sum_{j=1}^{a+id}\sum_{x=1}^{j}x^k$$ [算法]拉格朗日 ...

  4. 洛谷P5437/5442 约定(概率期望,拉格朗日插值,自然数幂)

    题目大意:$n$ 个点的完全图,点 $i$ 和点 $j$ 的边权为 $(i+j)^k$.随机一个生成树,问这个生成树边权和的期望对 $998244353$ 取模的值. 对于P5437:$1\le n\ ...

  5. LG4781 【模板】拉格朗日插值

    题意 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$取模 输入输出格 ...

  6. LG4781 【模板】拉格朗日插值 和 JLOI2016 成绩比较

    [模板]拉格朗日插值 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$ ...

  7. 【Luogu4781】【模板】拉格朗日插值

    [Luogu4781][模板]拉格朗日插值 题面 洛谷 题解 套个公式就好 #include<cstdio> #define ll long long #define MOD 998244 ...

  8. P4781 【模板】拉格朗日插值

    P4781 [模板]拉格朗日插值 证明 :https://wenku.baidu.com/view/0f88088a172ded630b1cb6b4.html http://www.ebola.pro ...

  9. Luogu 4781 【模板】拉格朗日插值

    模板题. 拉格朗日插值的精髓在于这个公式 $$f(x) = \sum_{i = 1}^{n}y_i\prod _{j \neq i}\frac{x - x_i}{x_j - x_i}$$ 其中$(x_ ...

随机推荐

  1. Jenkins服务使用 宿主机的docker、docker-compose (Jenkins 执行sudo命令时出现“sudo: no tty present and no askpass program specified”,以及 docker-compose command not found解决办法)

    若要转载本文,请务必声明出处:https://www.cnblogs.com/zhongyuanzhao000/p/11681474.html 原因: 本人最近正在尝试CI/CD,所以就使用了 Jen ...

  2. SPOJ Qtree系列

    Qtree1 将边权变为这条边连接的两个点中深度更深的点的点权,这样就可以变为带修改链上最大点权.直接树链剖分即可. 下面是一份C语言代码 #include<stdio.h> #inclu ...

  3. .Net MVC如何渲染带有网页标签的字符串

    有时候我们在解析一段文字时,可能文字中会包含网页上的标签,如div.p等等.那么如果将这种文字渲染成对应的标签效果呢?如图,最近博主就拿到了这么一段字符串(如图) 由于中间带有很多特殊字符,用Html ...

  4. CSS控制DIV水平垂直居中

    <div style="position:absolute; width: 600px; height: 200px; left: 50%; top: 50%; margin-left ...

  5. 2019 字节跳动java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.字节跳动等公司offer,岗位是Java后端开发,因为发展原因最终选择去了字节跳动,入职一年时间了,也成为了面 ...

  6. Java知识回顾 (15) 文档注释

    说明注释允许你在程序中嵌入关于程序的信息. 你可以使用 javadoc 工具软件来生成信息,并输出到HTML文件中,使你更加方便的记录你的程序信息. javadoc 标签 标签 描述 示例 @auth ...

  7. springmvc框架helloword

    spring框架提供了构建web的应用程序的全功能MVC模块-spring mvc.我们首先来写一个springmvc的hellword的配置文件的形式 工程结构如下 index.jsp <%@ ...

  8. 从客户端中检测到有潜在危险的 Request.QueryString 值

    解决办法: 一.解决方法是在web.config的 里面加入<system.web> <pages validateRequest="false"/>< ...

  9. webpack练手项目之easySlide(二):代码分割

    Hello,大家好. 在上一篇 webpack练手项目之easySlide(一):初探webpack  中我们一起为大家介绍了webpack的基本用法,使用webpack对前端代码进行模块化打包. 但 ...

  10. 多代理切换 MultiProxy

    配置代理选项 添加代理列表 ie配置代理 开始使用