LG4948 题解报告
Description
求
\[\sum_{i-1}^{n}{i^k\cdot a^i}
\]
的值,其中 \(n\le10^{18},k\le 2\times 10^3,a\le 10^9\) 。
Solution
本题在《具体数学》一书中有详细的解法思路说明,可以在该书第二章 <和式> 中得到思路的启发。
对这个式子进行扰动。
令
\[S(k)=\sum_{i=1}^{n}{i^k}
\]
当 \(a= 1\) 时,有
\[S(k)=\sum_{i=1}^{n}{i^k} \\
=\sum_{i=1}^{n}(i+1)^k-(n+1)^k+1
\]
根据二项式定理
\[(x+y)^k =\sum_{i=0}^{k}{\binom{k}{i}\cdot x^iy^{k-i}}
\]
有
\[S(k)=\sum_{i=1}^{n}{\sum_{j=0}^{k}\binom{k}{j}\cdot i^j}-(n+1)^k+1\\
=\sum_{j=0}^{k}\binom{k}{j}{\sum_{i=1}^{n}i^j}-(n+1)^k+1\\
=\sum_{j=0}^{k}\binom{k}{j}{S(j)}-(n+1)^k+1
\]
由于 \(\binom{k}{k}=1\) ,则
\[\sum_{j=0}^{k-1}{\binom{k}{j}}S(j)-(n+1)^k+1=0
\]
由于\(\binom{k}{k-1}=k\) ,则
\[k\cdot S(k-1)=(n+1)^k-\sum_{j=0}^{k-2}{\binom{k}{j}S(j)-1}\\
S(k-1)=\frac{(n+1)^k-\sum_{j=0}^{k-2}{\binom{k}{j}S(j)-1}}{k}
\]
令 \(t=k-1\) ,有
\[S(t)=\frac{(n+1)^{t+1}-\sum_{j=0}^{t-1}{\binom{t+1}{j}S(j)-1}}{t+1}
\]
把 \(k\) 换回来,有
\[S(k)=\frac{(n+1)^{k+1}-\sum_{j=0}^{k-1}{\binom{k+1}{j}S(j)-1}}{k+1}\\
S(0)=n
\]
这个式子可以 $O(k^2) $求。
s同理的考虑 \(a\not= 1\) ,则令
\[S(k)=\sum_{i=1}^{n}i^ka^i
\]
可以解得
\[S(k)=\frac{(n+1)^k\cdot a^{n+1}-a\sum_{j=0}^{k-1}{\binom{k}{j}S(j)-a}}{a-1}\\
S(0)=\frac{a^{n+1}-a}{a-1}
\]
同理 \(O(k^2)\) 求解,该式和边界情况留给读者自证,方法类似。
Code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int mod = 1e9 + 7;
constexpr int K = 2e3 + 10;
inline void chk(int &x) {x -= mod; x += x >> 31 & mod;}
inline int mll(int x, int y) {return (ll) x * y % mod;}
inline int inc(int x, int y) {chk(x += y); return x ;}
inline int dec(int x, int y) {return inc(x, mod - y);}
inline int ksm(int x, int y) {
int ret = 1;
for(; y; y >>= 1, x = mll(x, x))
if(y & 1) ret = mll(ret, x);
return ret;
}
inline int Inv(int x) {return ksm(x, mod - 2);}
int fc[K], fv[K], inv[K];
inline void pref(const int lim) {
fc[0] = 1;
for(int i = 1; i <= lim; i++)
fc[i] = mll(fc[i - 1], i);
fv[lim] = Inv(fc[lim]);
for(int i = lim; i >= 1; i--)
fv[i - 1] = mll(fv[i], i);
for(int i = 1; i <= lim; i++)
inv[i] = mll(fv[i], fc[i - 1]);
return ;
}
inline int binom(int n, int m) {
if(n < m) return 0;
return mll(fc[n], mll(fv[m], fv[n - m]));
}
int f[K];
ll n, a, k;
int main() {
cin >> n >> a >> k;
pref(k);
if(a == 1) {
f[0] = n % mod;
for(int i = 1; i <= k; i++) {
int sum1 = ksm(n + 1, i + 1), sum2 = 0;
for(int j = 0; j < i; j++)
chk(sum2 += mll(binom(i + 1, j), f[j]));
f[i] = mll(dec(sum1, sum2 + 1), inv[i + 1]);
}
} else {
int iv = Inv(a - 1);
f[0] = mll(dec(ksm(a, n + 1), a), iv);
for(int i = 1; i <= k; i++) {
int sum1 = mll(ksm(n + 1, i), ksm(a, n + 1)), sum2 = 0;
for(int j = 0; j < i; j++)
chk(sum2 += mll(binom(i, j), f[j]));
sum2 = mll(sum2, a);
f[i] = mll(dec(dec(sum1, sum2), a), iv);
}
}
cout << f[k] << '\n';
return 0;
}

浙公网安备 33010602011771号