CF622F——自然数幂和模板&&拉格朗日插值
题意
求 $ \displaystyle \sum_{i=1}^n i^k \ mod (1e9+7), n \leq 10^9, k \leq 10^6$.
分析
易知答案是一个 $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 ;
}
#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——自然数幂和模板&&拉格朗日插值的更多相关文章
- Codeforces 622F The Sum of the k-th Powers ( 自然数幂和、拉格朗日插值法 )
题目链接 题意 : 就是让你求个自然数幂和.最高次可达 1e6 .求和上限是 1e9 分析 : 题目给出了最高次 k = 1.2.3 时候的自然数幂和求和公式 可以发现求和公式的最高次都是 k+1 ...
- 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 ...
- 【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$$ [算法]拉格朗日 ...
- 洛谷P5437/5442 约定(概率期望,拉格朗日插值,自然数幂)
题目大意:$n$ 个点的完全图,点 $i$ 和点 $j$ 的边权为 $(i+j)^k$.随机一个生成树,问这个生成树边权和的期望对 $998244353$ 取模的值. 对于P5437:$1\le n\ ...
- LG4781 【模板】拉格朗日插值
题意 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$取模 输入输出格 ...
- LG4781 【模板】拉格朗日插值 和 JLOI2016 成绩比较
[模板]拉格朗日插值 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$ ...
- 【Luogu4781】【模板】拉格朗日插值
[Luogu4781][模板]拉格朗日插值 题面 洛谷 题解 套个公式就好 #include<cstdio> #define ll long long #define MOD 998244 ...
- P4781 【模板】拉格朗日插值
P4781 [模板]拉格朗日插值 证明 :https://wenku.baidu.com/view/0f88088a172ded630b1cb6b4.html http://www.ebola.pro ...
- Luogu 4781 【模板】拉格朗日插值
模板题. 拉格朗日插值的精髓在于这个公式 $$f(x) = \sum_{i = 1}^{n}y_i\prod _{j \neq i}\frac{x - x_i}{x_j - x_i}$$ 其中$(x_ ...
随机推荐
- Unary模式下客户端从开始连接到发送接收数据的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端从开始连接到发送数据的主要流程 graph TD; ...
- Linux基础(11)原始套接字
一边接收函数返回一边判断返回值时一定要把接收的优先级加()提高再去判断 例 if((sockfd = socket()) < 0) 问题: 如何实现SYN扫描器扫描端口 , 比如AB两个设备要进 ...
- GreenPlum 最佳实践
数据模型 Greenplum数据库是一种shared nothing的分析型MPP数据库.这种模型与高度规范化的/事务型的SMP数据库有显著区别.Greenplum数据库使用非规范化的模式设计会工作得 ...
- hystrix中request cache请求缓存
有一个概念,叫做reqeust context,请求上下文,一般来说,在一个web应用中, 我们会在一个filter里面,对每一个请求都施加一个请求上下文,就是说,tomcat容器内,每一次请求,就是 ...
- python抓取贝壳房源信息
分析了贝壳的房源信息数据,发现地址链接的参数传递是有规律的 https://tj.ke.com/chengjiao/a3l4/ a3 实际表示的 l4 表示的是 然后 将复合条件拼成一个字符串,带过去 ...
- pyhon opencv mojave 摄像头报错
https://blog.csdn.net/renzibei/article/details/82998933 参考了上面博主的例子,才明白. Mac macOS 10.14 Mojave Xcode ...
- 深入理解es6(上)
一.let和const 1.let与var的区别 不存在变量提升 块级作用域 不允许重复声明 2.const常量 const与let一样,唯一区别在于声明的常量不能被修改 二.解构赋值 es6按照一定 ...
- echarts自动播放图形
echarts中要做到自动播放的功能,首先是要实现能缩放的功能,而缩放的功能是由配置项dataZoom来控制的,而dataZoom中分为inside和slider,分别是内置的控制器和外部的控制器,内 ...
- 基于webpack的前端工程化开发解决方案探索(二):代码分割与图片加载
今天我们继续来进行webpack工程化开发的探索! 首先来验证上一篇文章 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML 中的遗留问题:webpack将如何处理按需加载的 ...
- centos7 上Docker安装与启动
1. docker centos 文档地址 https://docs.docker.com/install/linux/docker-ce/centos/ 2. 安装环境说明: docker社区版 ...