LG4948 题解报告

P4948 题解报告

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;
}

End

posted @ 2021-07-20 16:48  Kamiya-Kina  阅读(99)  评论(0)    收藏  举报