题意

求 $ \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. QQ联合登录(基于Oauth2.0协议)

    1. 获取授权码Authorization Code https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id= ...

  2. [转帖]Linux超级用户root口令忘记怎么办?

    Linux超级用户root口令忘记怎么办? 2010-05-10 12:15:00 monkey_d_meng 阅读数 5535  收藏 更多 分类专栏: Linux   版权声明:本文为博主原创文章 ...

  3. pyhthon Opencv截取视频中的图片

    import os import cv2 ##加载OpenCV模块 def video2frames(pathIn='', pathOut='', imgname='', only_output_vi ...

  4. gtest入门

    介绍 gtest是谷歌开发的用来做C++单元测试的测试框架 基本概念 使用gtest,你就需要写断言(assertions),用来检查一个表达式是否为true.断言的结果有三个:正确.非致命错误.致命 ...

  5. 个人GitHub资源分享仓库

    个人GitHub资源分享仓库   门牌号:https://github.com/ZeroPhong/Learning-Resource 2019年10月27日 注册GitHub账号,仓库建立: 当天上 ...

  6. 树莓派搭建python环境服务器

    树莓派搭建python环境服务器 服务器结构大致为:django+uwsgi+nginx+python+sqlite 配置python环境 系统本身自带了python2.7和python3.5.在这里 ...

  7. Docker之网络配置

    目的: Docker网络配置   Docker部署SpringCloud项目 Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/conta ...

  8. asp.net core 之中间件

    Http请求资源的过程可以看成一个管道:“Pipe”,并不是所有的请求都是合法的.安全的,其于功能.性能或安全方面的考虑,通常需要在这管道中装配一些处理程序来筛选和加工这些请求.这些处理程序就是中间件 ...

  9. ConcurrentDictionary,ConcurrentStack,ConcurrentQueue

    static void Main(string[] args) { var concurrentDictionary = new ConcurrentDictionary<int, string ...

  10. aria2 https

    https://github.com/aria2/aria2/issues/361 ... and also make sure that aria2 was built with HTTPS sup ...