51nod 1228 序列求和

2021-08-19 15:29:41 字數 1467 閱讀 2595

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 + 1行:每行2個數,n, k中間用空格分割。(1 <= n <= 10^18, 1 <= k <= 2000) output 共t行,對應s(n) mod 1000000007的結果。 sample input

3 5 3

4 2

4 1

sample output

225

30 10

首先k^2的做法可以考慮用二項式定理展開 然後遞迴做即可

伯努利數公式 b[

0]=1

b [0

]=

1∑k=

0nck

n+1×

b[k]

=0∑ k=

0ncn

+1k×

b[k]

=0

考慮如何用伯努利數算自然數冪和

有公式 ∑i

=1ni

k=1k

+1∑i

=1k+

1cik

+1×b

[k+1

−i]×

(n+1

)i∑ i=

1nik

=1k+

1∑i=

1k+1

ck+1

i×b[

k+1−

i]×(

n+1)

i預處理之後可以o(k) 解決

#include

#include

#include

#define ll long long

using namespace std;

inline char gc()

return

*s++;

}inline ll read()

while(isdigit(ch)) x=x

*10+ch-'0',ch=gc();

return

x*f;

}const int mod=1000000007;

const int n=2200;

inline int inc(int

x,int v)

int t,inv[n],c[n][n],k,b[n];ll n;

int main()

while(t--)ans=inv[k+1]*ans

%mod;printf("%lld\n",ans);

}return

0;}

51nod1228 序列求和

設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 關於求自然數冪和,這...

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