自然數冪和的求法有很多
大概有
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 ...