题解 P4948 【数列求和】

· · 题解

题意:求\sum_{i=1}^ni^ka^i

要分两种情况考虑

(1) a \neq 1

S(k)=\sum_{i=1}^ni^ka^i S(k)=\sum_{i=1}^ni^ka^i=\sum_{i=1}^n(i+1)^ka^{i+1}-(n+1)^ka^{k+1}+a =\sum_{i=1}^n\sum_{j=0}^k\binom{k}{j}i^ja^{i+1}-(n+1)^ka^{k+1}+a =\sum_{j=0}^k\binom{k}{j}\sum_{i=1}^ni^ja^{i+1}-(n+1)^ka^{k+1}+a =a\sum_{j=0}^k\binom{k}{j}S(j)-(n+1)^ka^{k+1}+a

移项

S(k)=\dfrac{(n+1)^ka^{k+1}-a\displaystyle\sum_{j=0}^{k-1}\binom{k}{j}S(j)-a}{a-1} *** (2)$a=1 S(k)=\sum_{i=1}^ni^k S(k)=\sum_{i=1}^n(i+1)^k-(n+1)^k+1 =\sum_{i=1}^n\sum_{j=0}^k\binom{k}{j}i^j-(n+1)^k+1 =\sum_{j=0}^k\binom{k}{j}\sum_{i=1}^ni^j-(n+1)^k+1 =\sum_{j=0}^k\binom{k}{j}S(j)-(n+1)^k+1 \sum_{j=0}^{k-1}\binom{k}{j}S(j)-(n+1)^k+1=0 \binom{k}{k-1}S(k-1)=(n+1)^k-\sum_{j=0}^{k-2}\binom{k}{j}S(j)-1 S(k)=\dfrac{(n+1)^{k+1}-\displaystyle\sum_{j=0}^{k-1}\binom{k+1}{j}S(j)-1}{k+1} ```cpp #include <iostream> using LL = long long; LL n; const int mod = 1E9 + 7; const int K = 2005; int a, k, C[K][K], S[K]; void up(int &x, int y) { if ((x += y) >= mod) x -= mod; } int pow(LL x, LL y) { int ans = 1; x %= mod; y %= mod - 1; for (; y; y >>= 1, x = static_cast<LL> (x) * x % mod) if (y & 1) ans = static_cast<LL> (ans) * x % mod; return ans; } int main() { std::cin >> n >> a >> k; C[0][0] = 1; for (int i = 1; i < K; i++) { C[i][0] = 1; for (int j = 1; j <= i; j++) up(C[i][j] = C[i - 1][j - 1], C[i - 1][j]); } if (a == 0) std::puts("0"); if (a == 1) { S[0] = n % mod; for (int i = 1; i <= k; i++) { int sum = 0; for (int j = 0; j < i; j++) up(sum, static_cast<LL> (C[i + 1][j]) * S[j] % mod); up(sum = mod - sum, pow(n + 1, i + 1) - 1); S[i] = static_cast<LL> (sum) * pow(i + 1, mod - 2) % mod; } std::printf("%d\n", S[k]); } if (a > 1) { S[0] = static_cast<LL> (pow(a, n + 1) - a + mod) * pow(a - 1, mod - 2) % mod; for (int i = 1; i <= k; i++) { int sum = 0; for (int j = 0; j < i; j++) up(sum, static_cast<LL> (C[i][j]) * S[j] % mod); up(sum = mod - sum, static_cast<LL> (pow(n + 1, i)) * pow(a, n) % mod - 1); S[i] = static_cast<LL> (sum) * a % mod * pow(a - 1, mod - 2) % mod; } std::printf("%d\n", S[k]); } return 0; } ```