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