伯努利數 51Nod 1258 序列求和 V4

2021-07-29 22:45:59 字數 1776 閱讀 3440

自然數冪和的求法有很多

大概有

wiki傳送門

acdreamer的blog

伯努利數有兩種b+

和b−

唯一的爭議就在b1

上 因為 對於

n>

1 有b2

n+1=

0 其實這不是什麼大問題 一般個人習慣用b−

以下不註明

b 都表示b−

然後我就只會伯努利數最裸的應用了

伯努利數的預處理

可以直接通過

m2)

範圍大時使用

b 的指數生成函式

膜拜pls

順便 對於另一類伯努利數b+

i=0b

+ii!

xi=x

exex

−1

然後回到這個題 %1e9+7? 我只會三模數ntt

然後一次倍增要15次ntt

資料範圍不大 跑的竟然比我想象的要快

#include

#include

#include

using namespace std;

typedef long long ll;

const int p=1e9+7;

const int m=;

const int g=;

const ll _m=(ll)m[0]*m[1];

inline ll pow(ll a,int b,int p)

inline ll mul(ll a,ll b,ll p)

const int m1=m[0],m2=m[1],m3=m[2];

const int inv1=pow(m1%m2,m2-2,m2),inv2=pow(m2%m1,m1-2,m1),inv12=pow(_m%m3,m3-2,m3);

inline int crt(int a1,int a2,int a3)

const int n=264000;

int r[n];

struct ntt

void fft(int

*a,int n,int r)

if (!r) for (int i=0,inv=pow(n,p-2,p);i*inv

%p; }

}ntt[3];

int tmp[n],b2[n],b3[n],_b[3][n],c[n];

inline void getinv(int

*a,int

*b,int n)

for (int i=0;i

(c[0]+=2)%=p;

for (int i=0;i<3;i++)

for (int i=0;i0][i],_b[1][i],_b[2][i]),b[n+i]=0;

}ll fac[n],inv[n];

inline void init(int n)

inline ll c(int n,int

m)int n,m;

int a[n],b[n];

int _a[3][n],b[n];

inline int solve(ll n,int

m)int main()

return

0;}

51nod1228 序列求和 (伯努利數)

1228 序列求和 hackerrank 基準時間限制 3 秒 空間限制 131072 kb 分值 160 難度 6級演算法題 t n n k,s n t 1 t 2 t n 給出n和k,求s n 例如k 2,n 5,s n 1 2 2 2 3 2 4 2 5 2 55。由於結果很大,輸出s n m...

51nod 1228 序列求和(伯努利數

1228 序列求和 基準時間限制 3 秒 空間限制 131072 kb 分值 160 難度 6級演算法題 收藏關注t n n k,s n t 1 t 2 t n 給出n和k,求s n 例如k 2,n 5,s n 1 2 2 2 3 2 4 2 5 2 55。由於結果很大,輸出s n mod 1000...

51nod 1062 序列中最大的數

1062 序列中最大的數 ural 1079 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 有這樣乙個序列a a 0 0 a 1 1 a 2i a i a 2i 1 a i a i 1 輸入乙個數n,求a 0 a n 中最大的數。a 0 0,a 1 1,a 2 ...