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 ...
随机推荐
- 移动APP接口安全性设计
移动APP接口是怎么保证安全性的,可以采用https,或者是非对称加密. 接口加密的目的是防止被别人用抓包工具,抓包后篡改数据. 关于加密算法常见的有对称加密(DES)和非对称加密(RSA) 对称加密 ...
- 【转帖】lsof命令总结
lsof命令总结 https://www.cnblogs.com/chenqionghe/p/10677179.html 一.lsof是什么 lsof (list open files)是一个列出当前 ...
- java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- easyui中formatter的用法
easyui中formatter的用法 当我们使用easyui需要对某一列进行格式化处理value数据时,可以使用formatter进行格式化 这里以一个商品表举例,商品表中有一个商品类型的字段,数据 ...
- Go基础编程实践(七)—— 并发
同时运行多个函数 观察常规代码和并发代码的输出顺序. // 常规代码,顺序执行,依次输出 package main import ( "fmt" "time" ...
- 学习docker 部署nginx记录
docker pull nginx $ docker pull nginx $ docker run --name nginx-test -p 8081:80 -d nginx docker conf ...
- Bean named 'XXX' is expected to be of type [XXX] but was actually of type [com.sun.proxy.$Proxy7
AOP原理 <aop:aspectj-autoproxy />声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面. <aop:aspectj-aut ...
- python pip安装解决方法
一招解决python pip install 安装库失败 PIP是python强大的安装利器,但是我们经常遇到安装库失败的问题,以下本人觉得最有效的解决方法: 1.打开 https://www.l ...
- 【Win10】系统修改
1.删除“快速访问”[操作说明] a.打开HKEY_CLASSES_ROOT\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}\ShellFolder ...
- 关于服务器程序运行中收到SIGPIPE(转)
(此文为原文删减版,原文地址:http://blog.sina.com.cn/s/blog_502d765f0100kopn.html) 我写了一个服务器程序,在Linux下测试,然后用C++写了客户 ...