题解:P4948 数列求和
stripe_python · · 题解
请注意,本文中的
之前我研究过这个问题,当时给出了一个
那么我们给出一个
设
分
- 当
k 为奇数时,有
- 当
k 为偶数时,有
递归求解即可,边界为
需要注意,偶数情况的
如果使用杨辉三角递推组合数,该做法支持任意模数。
constexpr int N = 2005;
long long n, k;
mint x, c[N][N];
void prework() {
for (int i = 0; i <= n; i++) c[i][0] = c[i][i] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
}
}
vector<mint> solve(long long k) {
if (k == 1) return vector<mint>(n + 1, x);
vector<mint> S(n + 1);
if (k & 1) {
auto T = solve(k - 1);
for (int i = 0; i <= n; i++) {
mint cur = 0;
for (int j = 0; j <= i; j++) cur += c[i][j] * T[j];
S[i] = x + x * cur;
}
return S;
} else {
auto T = solve(k >> 1);
mint p = x.pow(k >> 1);
for (int i = 0; i <= n; i++) {
mint cur = 0, b = k >> 1, pw = 1;
for (int j = i; j >= 0; j--, pw *= b) cur += c[i][j] * T[j] * pw;
S[i] = T[i] + p * cur;
}
return S;
}
}
void _main() {
cin >> k >> x >> n;
prework();
auto S = solve(k);
cout << S[n];
}