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