1228 序列求和 (伯努利数求自然数幂和)

题目链接:哆啦A梦传送门

题意:求    {\color{Blue} \sum_{i=1}^{n}i^{k}}

 

题解:因为这里多测试案例很多,一般方法 O(k^2)会T。

 

故我们用伯努利数公式,O(k)解决。

公式描述如下

     

 

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

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

 

     伯努利数满足条件,且有

       

     

     那么继续得到

     

 

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

 

代码:

#include
#include
#include

using namespace std;

typedef long long LL;
const int maxn=2010;
const LL mod=1000000007;

LL C[maxn][maxn];
LL B[maxn],inv[maxn],jie[maxn];
LL temp[maxn];
LL n;


void init()
{
    int N=2002;

    ///线性筛逆元
        inv[1] = 1;
    for(int i=2; i

 


 

你可能感兴趣的:(数论)