Bernoulli Number
今天我们讨论的问题是如何有效地求自然数的幂和。接下来以3个经典题目为例来讲解。
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1864
分析:其实求自然数的幂和方法有很多种,先来看看普通的递推求法,由于
那么对于所有的累加得到
进一步得到
可以看出这是一个递推式,如果我们记
那么得到如下递归式
递归出口是
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1228
分析:本题题意就是求自然数的幂和,但是它的case比较多。对于求幂和本身就需要的时间复杂度,如果继
续用上述方法来求自然数的幂和,5000个case会TLE,接下来介绍另一个求自然数幂和的方法,它是基于伯
努利数的,公式描述如下
可以看出只要我们预处理出每一项,就可以在线性时间内求得自然数的幂和。前面的倒数可以用递推法求逆元
预处理,组合数也可以预处理,也可以先预处理,现在关键是如何预处理伯努利数。
伯努利数满足条件,且有
那么继续得到
这就是伯努利数的递推式,逆元部分同样可以预处理。
代码:
#include <iostream>
#include <string.h>
#include <stdio.h>using namespace std;
typedef long long LL;
const LL MOD = 1000000007;
const int N = 2005;LL C[N][N];
LL B[N],Inv[N];
LL Tmp[N];
LL n;void Init()
{//预处理组合数for(int i=0; i<N; i++){C[i][0] = C[i][i] = 1;if(i == 0) continue;for(int j=1; j<i; j++)C[i][j] = (C[i-1][j] % MOD + C[i-1][j-1] % MOD) % MOD;}//预处理逆元Inv[1] = 1;for(int i=2; i<N; i++)Inv[i] = (MOD - MOD / i) * Inv[MOD % i] % MOD;//预处理伯努利数B[0] = 1;for(int i=1; i<N; i++){LL ans = 0;if(i == N - 1) break;for(int j=0; j<i; j++){ans += C[i+1][j] * B[j];ans %= MOD;}ans *= -Inv[i+1];ans = (ans % MOD + MOD) % MOD;B[i] = ans;}
}LL Work(int k)
{LL ans = Inv[k+1];LL sum = 0;for(int i=1; i<=k+1; i++){sum += C[k+1][i] * Tmp[i] % MOD * B[k+1-i] % MOD;sum %= MOD;}ans *= sum;ans %= MOD;return ans;
}int main()
{int T;Init();scanf("%d", &T);while(T--){int k;scanf("%I64d %d", &n, &k);n %= MOD;Tmp[0] = 1;for(int i=1; i<N; i++)Tmp[i] = Tmp[i-1] * (n + 1) % MOD;printf("%I64d\n", Work(k));}return 0;
}
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1258
分析:本题与上题不同的是值比较大,达到50000,如果采用同样的方法,会TLE的。那么必定要进行优化。
参考Pick大神的方法,如下
链接:http://picks.logdown.com/posts/189620-the-inverse-element-of-polynomial
Bernoulli Number相关推荐
- 伯努利数(Bernoulli number)
设B0=1,当k>0时,定义 这些Bi(i=0, 1,-, k)被称为伯努利数.按定义,自然得出:B1=-,B2=,B3=0,B4=-,B5=0,B6=,B7=0,B8=-,-.伯努利数是瑞士数 ...
- Real-Time Rendering-附录B 三角函数
Appendix B Trigonometry(附录B 三角函数) "Life is good for only two things, discovering mathematics an ...
- An Introduction to K-theory
An Introduction to K-theory Eric M. Friedlander∗ Department of Mathematics, Northwestern University, ...
- WV.30-大数阶乘算法10-用Stirling逼近近似计算阶乘的探讨与应用
用Stirling逼近近似计算阶乘的探讨与应用 江苏省赣榆高级中学仲晨 myheimu@yahoo.com.cn [关键词]: Stirling逼近,阶乘,极限论,微积分,数学实验,计算机算法 &qu ...
- 用Stirling逼近近似计算阶乘的探讨与应用
"阶乘"(factorial)在信息学竞赛中具有重要角色,更广泛的说,"阶乘"在数学领域也是占有重要地位.在许多人刚刚学习计算机语言的时候,大多会被要求写一个算 ...
- 概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用
Bernoulli分布(Bernoulli distribution):是单个二值随机变量的分布.它由单个参数ø∈[0,1],ø给出了随机变量等于1的概率.它具有如下的一些性质: P(x=1)= ø ...
- matlab怎么伯努利分布,伯努利分布 Bernoulli distribution
伯努利分布 是一种离散分布,有两种可能的结果.1表示成功,出现的概率为p(其中0 概率分布有两种类型:离散(discrete)概率分布和连续(continuous)概率分布. 离散概率分布也称为概率质 ...
- 伯努利分布(Bernoulli distribution)
伯努利分布 是一种离散分布,有两种可能的结果.1表示成功,出现的概率为p(其中0<p<1).0表示失败,出现的概率为q=1-p.这种分布在人工智能里很有用,比如你问机器今天某飞机是否起飞了 ...
- 1215. bernoulli
Description 实现一棵Bernoulli树.实现下列操作: insert X,将整数X加入优先队列 delete,将优先队列中最小值弹出 min,输出最小值 初始优先队列为空. Input ...
最新文章
- 传智168期JavaEE struts2杜宏 day 29~day31笔记(2017年2月4日23:14:00)
- HTML form 标签的 action 属性
- Hadoop的mapper输出中key和value之间的分隔符
- 对于一个管理性的软件来讲,数据主键的产生策略是很关键的一点,这个关系到整个系统的基础架构思想。...
- TCP send 阻塞与非阻塞
- Java基础入门笔记-整数+小数+字符串+打印
- 探索移动Web网页编码设计
- Linux环境下Git的安装以及使用
- himall微信支付
- Windows编译运行EasyPR
- Appium系列教程
- word一键生成ppt 分页_一键实现Word转PPT的三种方法评测
- CentOS官网下载所需版本的CentOS版本方法
- android 主流分辨率是多少,android手机常用分辨率有哪些?
- MySQL 查询统计订单
- 【matlab】解方程组
- mysql和ocrcle_oracle 12.1 RAC的ocr磁盘组异常恢复
- 面对ChatGPT的挑战,谷歌CEO怒发Bard调教指南:别慌,咱向来是弯道超车
- 智能车入门——跑车前的零碎知识<新手从零做车>
- clickhouse--求累计数值
热门文章
- 数据结构与算法基础Day1
- 罗技 连点 脚本_罗技发布无线版的Pro X游戏耳机,拥有20小时续航时间
- win10无线投屏_如何将安卓手机实时投屏到个人电脑
- ioswebview混编_iOS 原生和H5混合开发总结
- ModuleNotFoundError: No module named ‘sentence_transformers‘
- 京东技术助力十余省抗击疫情 应急资源平台已提供超6.6亿件抗疫物资
- arduino 电子时钟
- 社交战争下半场:从流量战到内容战
- 单页面cnd 引入 vant+vue+h5 应用vant
- sklearn 学习之 model_selection