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+1)^i $$
因为
$$\sum_{k=0}^nC_{n+1}^kB_k=0(B_0=1)$$
所以
$$ B_n={- {1\over{n+1}}}(C_{n+1}^0B_0+C_{n+1}^1B_1+……C_{n+1}^{n-1}B_{n-1})$$
伯努利数的证明十分复杂,记住即可。
题目
求 $\sum_{i=1}^ni^k \ mod \ (1e9+7)$,$i \leq 10^{18}, k \leq 2000, T \leq 2000$.
分析
直接用上面的公式,预处理伯努利数,时间为为 $O(k^2)$。
有 $O(klogk)$ 的方法求伯努利数,但是比较复杂,以后再学吧。
单次的时间只有 $O(k)$,$T$ 组查询不会超时。
#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const ll mod = 1e9 + ;
const int maxk = + ;
ll n, k; ll C[maxk][maxk], inv[maxk], B[maxk];
void init()
{
//预处理组合数
C[][] = ;
for(int i = ;i < maxk;i++)
{
C[i][] = ;
for(int j = ;j <= i;j++)
C[i][j] = (C[i-][j-] + C[i-][j]) % mod;
}
//预处理逆元
inv[] = ;
for(int i = ;i < maxk;i++)
inv[i] = (mod - mod/i) * inv[mod%i] % mod;
//预处理伯努利数
B[] = ;
for(int i = ;i < maxk-;i++)
{
ll tmp = ;
for(int j = ;j < i;j++)
tmp = (tmp + C[i+][j]*B[j]%mod) % mod;
tmp = tmp * (-inv[i+]) % mod;
B[i] = (tmp + mod) % mod;
}
} ll pw[maxk];
ll cal()
{
n %= mod; //想一想为什么可以这样做
pw[] = ;
for(int i = ;i <= k+;i++) pw[i] = pw[i-] * (n+) % mod; ll ret = ;
for(int i = ;i <= k+;i++)
ret = (ret + C[k+][i]*B[k+-i]%mod*pw[i]%mod) % mod;
ret = ret * inv[k+] % mod;
return ret;
} int main()
{
init(); int T;
scanf("%d", &T);
while(T--)
{
scanf("%lld%lld", &n, &k);
printf("%lld\n", cal());
} return ;
}
参考链接:https://blog.csdn.net/acdreamers/article/details/38929067
51Node1228序列求和 ——自然数幂和模板&&伯努利数的更多相关文章
- 51nod1228 序列求和(自然数幂和)
与UVA766 Sum of powers类似,见http://www.cnblogs.com/IMGavin/p/5948824.html 由于结果对MOD取模,使用逆元 #include<c ...
- CF622F——自然数幂和模板&&拉格朗日插值
题意 求 $ \displaystyle \sum_{i=1}^n i^k \ mod (1e9+7), n \leq 10^9, k \leq 10^6$. CF622F 分析 易知答案是一个 $k ...
- 自然数幂和&伯努利数(Bernoulli)
二项式定理求自然数幂和 由二项式定理展开得 \[ (n+1)^{k+1}-n^{k+1}=\binom {k+1}1n^k+\binom {k+1}2n^{k-1}+\cdots+\binom {k+ ...
- 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]
1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50 ...
- UVA766 Sum of powers(1到n的自然数幂和 伯努利数)
自然数幂和: (1) 伯努利数的递推式: B0 = 1 (要满足(1)式,求出Bn后将B1改为1 /2) 参考:https://en.wikipedia.org/wiki/Bernoulli_numb ...
- HDU 2254 奥运(矩阵高速幂+二分等比序列求和)
HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意: 中问题不解释. 分析: 依据floyd的算法,矩阵的k次方表示这个矩阵走了k步. 所以k ...
- HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)
HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出 ...
- 51nod 1228 序列求和(伯努利数)
1228 序列求和 题目来源: HackerRank 基准时间限制:3 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 T(n) = n^k,S(n) = T(1 ...
- Codeforces 622F The Sum of the k-th Powers ( 自然数幂和、拉格朗日插值法 )
题目链接 题意 : 就是让你求个自然数幂和.最高次可达 1e6 .求和上限是 1e9 分析 : 题目给出了最高次 k = 1.2.3 时候的自然数幂和求和公式 可以发现求和公式的最高次都是 k+1 ...
随机推荐
- VirtualBox 配置 CentOS7网卡信息
在实际配置虚拟机的过程中,网络配置时候一个很繁琐的过程,经常一个点没注意到,就访问不了了.在此,做一个简单的教程以供后续使用时可以参考! 方法一: 使用NAT网络 1. 选择网卡 安装centos7的 ...
- 超级简单POI导出Excel实战
在一般的生产管理系统都会将数据通过页面导出到Excel,这里以Java为例通过第三方开源poi进行对Excel的操作,具体操作如下 1.引入jar包依赖 这里我以maven的方式引入jar包,具体依赖 ...
- Kibana访问报错
浏览器访问提示:Kibana server is not ready yet 查看日志如下 {"type":"log","@timestamp&quo ...
- 2019 人民网java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.人民网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了人民网,入职一年时间了,之前面试了很多 ...
- Java自学-数组 创建数组
Java 如何创建一个数组 数组是一个固定长度的,包含了相同类型数据的 容器 步骤 1 : 声明数组 int[] a; 声明了一个数组变量. []表示该变量是一个数组 int 表示数组里的每一个元素都 ...
- springCloud学习1(集中式配置管理)
springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 一.前言 在开发普通的 web 应用中,我们通常是将配置项写在单 ...
- caement Archaic spelling of cement
caement Archaic spelling of cement. caement Alternative forms[edit] caement (archaic) cæment (archai ...
- Windows VNC远程连接用法
VNC (Virtual Network Console)是虚拟网络控制台 被控端 被控端需要打开服务,等待主控端连接 服务端已经启动成功,右下角有小图标 主控端 打开主控端,连接被控端 输入被控端i ...
- restframework中根据请求的类型修改序列化类
只要在视图中重写get_serializer_class方法就可以,用if对请求的类型进行判断 def get_serializer_class(self): if self.action == &q ...
- Docker搭建私用仓库
搭建私有仓库 # 1.查找registry,官方的私用仓库镜像 docker search registry # 2.下载私有仓库镜像 docker pull registry # 3.创建并后台运行 ...