51nod1228 序列求和

2021-07-14 17:34:31 字數 1176 閱讀 4059

設t(n) = n^k,s(n) = ∑n

i=1t

(i) 。給出n和k,求s(n)。

例如k = 2,n = 5,s(n) = 1^2 + 2^2 + 3^2 + 4^2 + 5^2 = 55。

由於結果很大,輸出s(n) mod 1000000007的結果即可。

t≤5000

k≤2000

n≤10

18

n很大,所以複雜度不應該帶n

關於求自然數冪和,這裡用到了伯努利數。

設伯努利數第i項為b[i],那麼∑i

=1ni

k=1k

+1∑i

=1k+

1cik

+1b[

k+1−

i](n

+1)i

時間複雜度o(

tk)

設伯努利數第n項為b[n]。b[

n]=⎧

⎩⎨1−

1n+1

∑n−1

k=0c

kn+1

b[k]

n=0n≥1

伯努利數的性質:

當n≥1時,∑n

k=0c

kn+1

b[k]

=0

#include 

#include

#include

using namespace std;

const int maxn=2005,mo=1e9+7;

typedef long long ll;

int t,k,b[maxn],c[maxn][maxn],inv[maxn],ans,tmp;

ll n;

int main()

inv[1]=1;

for (int i=2;i0]=1;

for (int i=1;i0;

for (int k=0;k1][k]*b[k] % mo) % mo;

b[i]=((ll)b[i]*(-inv[i+1]) % mo+mo)%mo;

}scanf("%d",&t);

while (t--)

ans=(ll)ans*inv[k+1] % mo;

printf("%d\n",ans);

}return

0;}

51nod 1228 序列求和

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 1000000007的結果即可。input 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 5000 第2 t ...

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...