自然数幂和&伯努利数(Bernoulli)
二项式定理求自然数幂和
由二项式定理展开得
\]
那么,对于所有的\(n=1,2,3,\cdots\)累加得到
\]
进一步得到
\]
计\(S(n,k)=\sum_{i=1}^ni^k\),可以得到
\]
当\(k==1\),有\(S(n,1)=\frac{n\cdot(n+1)}{2}\)。
加入记忆化即可。
伯努利数
\]
伯努利数满足\(B_0=1\),且有
\]
那么有
\]
这样就可以\(O(n^2)\)预处理出伯努利数。
还可以对\(B_i\)构建指数型生成函数
\]
经过我也不懂得化简得到
B(x)=\frac{x}{e^x-1}\\
B[x]=ifac[x+1]
\end{split}
\]
可以利用多项式求逆在\(O(n\log n)\)计算伯努利数。
例题 51nod 1228 序列求和
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef long long LL;
const int N=10005,K=2005,mod=1e9+7;
using namespace std;
inline LL Getint(){register LL x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
int inv[N],fac[N],ifac[N],B[N];
int C(int n,int m){
if(n<m)return 0;
return (LL)fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
int S(LL n,int k){
int ret=0;
LL ori=(n+1)%mod,fac=ori;
for(int i=1;i<=k+1;i++,fac=(LL)fac*ori%mod)
ret=(ret+(LL)C(k+1,i)*B[k+1-i]%mod*fac)%mod;
return (LL)(ret+mod)%mod*inv[k+1]%mod;
}
int main(){
inv[1]=fac[0]=ifac[0]=1;
for(int i=2;i<=K;i++)inv[i]=(LL)inv[mod%i]*(mod-mod/i)%mod;
for(int i=1;i<=K;i++)fac[i]=(LL)fac[i-1]*i%mod;
for(int i=1;i<=K;i++)ifac[i]=(LL)ifac[i-1]*inv[i]%mod;
B[0]=1;
for(int i=1;i<=K;i++){
for(int j=0;j<i;j++)
B[i]=(B[i]-(LL)B[j]*C(i+1,j))%mod;
B[i]=(LL)B[i]*inv[i+1]%mod;
}
int T=Getint();
while(T--){
LL n=Getint(),k=Getint();
cout<<S(n,k)<<'\n';
}
return 0;
}
自然数幂和&伯努利数(Bernoulli)的更多相关文章
- UVA766 Sum of powers(1到n的自然数幂和 伯努利数)
自然数幂和: (1) 伯努利数的递推式: B0 = 1 (要满足(1)式,求出Bn后将B1改为1 /2) 参考:https://en.wikipedia.org/wiki/Bernoulli_numb ...
- 51Nod - 1228 序列求和 (自然数幂和+伯努利数)
https://vjudge.net/problem/51Nod-1228 Description T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k, ...
- Codeforces 622F The Sum of the k-th Powers ( 自然数幂和、拉格朗日插值法 )
题目链接 题意 : 就是让你求个自然数幂和.最高次可达 1e6 .求和上限是 1e9 分析 : 题目给出了最高次 k = 1.2.3 时候的自然数幂和求和公式 可以发现求和公式的最高次都是 k+1 ...
- 【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$$ [算法]拉格朗日 ...
- 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 ...
- CF622F——自然数幂和模板&&拉格朗日插值
题意 求 $ \displaystyle \sum_{i=1}^n i^k \ mod (1e9+7), n \leq 10^9, k \leq 10^6$. CF622F 分析 易知答案是一个 $k ...
- 51nod1228 序列求和(自然数幂和)
与UVA766 Sum of powers类似,见http://www.cnblogs.com/IMGavin/p/5948824.html 由于结果对MOD取模,使用逆元 #include<c ...
- 洛谷P5437/5442 约定(概率期望,拉格朗日插值,自然数幂)
题目大意:$n$ 个点的完全图,点 $i$ 和点 $j$ 的边权为 $(i+j)^k$.随机一个生成树,问这个生成树边权和的期望对 $998244353$ 取模的值. 对于P5437:$1\le n\ ...
- 求自然数幂和 B - The Sum of the k-th Powers CodeForces - 622F
题解: 很多方法 斯特林数推导略麻烦但是不依赖于模数 代码: 拉格朗日插值 由于可以证明这是个K+1次多项式于是可以直接用插值 #include <bits/stdc++.h> using ...
随机推荐
- Tensorflow的基础用法
简介 Tensorflow是一个深度学习框架,它使用图(graph)来表示计算任务,使用tensor(张量)表示数据,图中的节点称为OP,在一个会话(Session)的上下文中执行运算,最终产生ten ...
- JavaScript常用技巧之数组操作
1.获取最后数组中最后一个元素 . arr.slice(-1).pop() . arr[arr.length - 1] 2.过滤重复元素 arr.filter(function(v, i) { ret ...
- handsontable 随记
handsontable 怎么样获取合并之后的cell信息,如下 handsontable .getPlugin('mergeCells').mergedCellsCollection 看了他的源代码 ...
- Android中App可分配内存的大小(转)
转自:http://blog.csdn.net/u011506413/article/details/50965435 现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多 ...
- Ubuntu 16.04 安装docker-ce,docker-compose
Get Docker CE for Ubuntu 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc 使用 ...
- echarts 报表使用
下载echats后,将下包中的js引入项目,\echarts-2.2.7\echarts-2.2.7\build\dist //在页面中建立宽高的区域,用来显示报表 <div style=&qu ...
- es6学习笔记--箭头函数
基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...
- python pandas 使用列表快速创建数据 用于测试
创建数据和行append数据 >>> df = pd.DataFrame([['AA', 1.00], ['Ks', 2.00]], columns=['name', 'age']) ...
- windows API 创建系统托盘图标
系统托盘在我们使用的程序中很普遍,下面我们来看一个很不错的例子,使用Win32 API实现,对理解系统托盘有些帮助. [cpp] view plaincopy #include <windows ...
- linux 查看cpu,memory
https://www.cnblogs.com/ctypyb2002/p/9792951.html