今天我们讨论的问题是如何有效地求自然数的幂和。接下来以3个经典题目为例来讲解。

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1864

分析:其实求自然数的幂和方法有很多种,先来看看普通的递推求法,由于

那么对于所有的累加得到

进一步得到

可以看出这是一个递推式,如果我们记

那么得到如下递归式

递归出口是

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1228

分析:本题题意就是求自然数的幂和,但是它的case比较多。对于求幂和本身就需要的时间复杂度,如果继

续用上述方法来求自然数的幂和,5000caseTLE,接下来介绍另一个求自然数幂和的方法,它是基于伯

努利数的,公式描述如下

可以看出只要我们预处理出每一项,就可以在线性时间内求得自然数的幂和。前面的倒数可以用递推法求逆元

预处理,组合数也可以预处理,也可以先预处理,现在关键是如何预处理伯努利数

   伯努利数满足条件,且有

那么继续得到

这就是伯努利数的递推式,逆元部分同样可以预处理。

代码:

#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相关推荐

  1. 伯努利数(Bernoulli number)

    设B0=1,当k>0时,定义 这些Bi(i=0, 1,-, k)被称为伯努利数.按定义,自然得出:B1=-,B2=,B3=0,B4=-,B5=0,B6=,B7=0,B8=-,-.伯努利数是瑞士数 ...

  2. Real-Time Rendering-附录B 三角函数

    Appendix B Trigonometry(附录B 三角函数) "Life is good for only two things, discovering mathematics an ...

  3. An Introduction to K-theory

    An Introduction to K-theory Eric M. Friedlander∗ Department of Mathematics, Northwestern University, ...

  4. WV.30-大数阶乘算法10-用Stirling逼近近似计算阶乘的探讨与应用

    用Stirling逼近近似计算阶乘的探讨与应用 江苏省赣榆高级中学仲晨 myheimu@yahoo.com.cn [关键词]: Stirling逼近,阶乘,极限论,微积分,数学实验,计算机算法 &qu ...

  5. 用Stirling逼近近似计算阶乘的探讨与应用

    "阶乘"(factorial)在信息学竞赛中具有重要角色,更广泛的说,"阶乘"在数学领域也是占有重要地位.在许多人刚刚学习计算机语言的时候,大多会被要求写一个算 ...

  6. 概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用

    Bernoulli分布(Bernoulli distribution):是单个二值随机变量的分布.它由单个参数ø∈[0,1],ø给出了随机变量等于1的概率.它具有如下的一些性质: P(x=1)= ø ...

  7. matlab怎么伯努利分布,伯努利分布 Bernoulli distribution

    伯努利分布 是一种离散分布,有两种可能的结果.1表示成功,出现的概率为p(其中0 概率分布有两种类型:离散(discrete)概率分布和连续(continuous)概率分布. 离散概率分布也称为概率质 ...

  8. 伯努利分布(Bernoulli distribution)

    伯努利分布 是一种离散分布,有两种可能的结果.1表示成功,出现的概率为p(其中0<p<1).0表示失败,出现的概率为q=1-p.这种分布在人工智能里很有用,比如你问机器今天某飞机是否起飞了 ...

  9. 1215. bernoulli

    Description 实现一棵Bernoulli树.实现下列操作: insert X,将整数X加入优先队列 delete,将优先队列中最小值弹出 min,输出最小值 初始优先队列为空. Input ...

最新文章

  1. 传智168期JavaEE struts2杜宏 day 29~day31笔记(2017年2月4日23:14:00)
  2. HTML form 标签的 action 属性
  3. Hadoop的mapper输出中key和value之间的分隔符
  4. 对于一个管理性的软件来讲,数据主键的产生策略是很关键的一点,这个关系到整个系统的基础架构思想。...
  5. TCP send 阻塞与非阻塞
  6. Java基础入门笔记-整数+小数+字符串+打印
  7. 探索移动Web网页编码设计
  8. Linux环境下Git的安装以及使用
  9. himall微信支付
  10. Windows编译运行EasyPR
  11. Appium系列教程
  12. word一键生成ppt 分页_一键实现Word转PPT的三种方法评测
  13. CentOS官网下载所需版本的CentOS版本方法
  14. android 主流分辨率是多少,android手机常用分辨率有哪些?
  15. MySQL 查询统计订单
  16. 【matlab】解方程组
  17. mysql和ocrcle_oracle 12.1 RAC的ocr磁盘组异常恢复
  18. 面对ChatGPT的挑战,谷歌CEO怒发Bard调教指南:别慌,咱向来是弯道超车
  19. 智能车入门——跑车前的零碎知识<新手从零做车>
  20. clickhouse--求累计数值

热门文章

  1. 数据结构与算法基础Day1
  2. 罗技 连点 脚本_罗技发布无线版的Pro X游戏耳机,拥有20小时续航时间
  3. win10无线投屏_如何将安卓手机实时投屏到个人电脑
  4. ioswebview混编_iOS 原生和H5混合开发总结
  5. ModuleNotFoundError: No module named ‘sentence_transformers‘
  6. 京东技术助力十余省抗击疫情 应急资源平台已提供超6.6亿件抗疫物资
  7. arduino 电子时钟
  8. 社交战争下半场:从流量战到内容战
  9. 单页面cnd 引入 vant+vue+h5 应用vant
  10. sklearn 学习之 model_selection