Statement
Solution
拆式子,发现答案为:
∑
i
=
0
n
∑
j
=
1
a
+
i
d
∑
x
j
x
k
\sum_{i=0}^n\sum_{j=1}^{a+id}\sum_{x}^jx^k
i=0∑nj=1∑a+idx∑jxk
直接暴力插值即可,时间复杂度为
O
(
T
k
3
)
\mathcal O(Tk^3)
O(Tk3)
#include <bits/stdc++.h>
using namespace std;
const int MAXK = 2021;
const unsigned int P = 1234567891;
int f[MAXK];
int g[MAXK];
inline int add(int a, int b) {
a = (1ll * a + b) % P;
return a;
}
inline void incr(int& a, int b) {
a = add(a, b);
}
inline int qPow(int a, int b) {
int res = 1;
for (; b; b >>= 1, a = 1ll * a * a % P)
(b & 1) && (res = 1ll * res * a % P);
return res;
}
inline int Lagrange(int* o, int n, int k) {
int res = 0;
for (int i = 0;i <= k; ++i) {
int u = o[i], v = 1;
for (int j = 0;j <= k; ++j)
if (i != j)
u = 1ll * u * (n - j + P) % P,
v = 1ll * v * (i - j + P) % P;
incr(res, 1ll * u * qPow(v, P - 2) % P);
}
return res;
}
int main(void) {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int testCase = 0;
cin >> testCase;
while (testCase--) {
int n, k, a, d;
cin >> k >> a >> n >> d;
for (int i = 1;i <= k + 4; ++i)
f[i] = add(f[i - 1], qPow(i, k));
for (int i = 1;i <= k + 4; ++i)
incr(f[i], f[i - 1]);
for (int i = 0;i <= k + 4; ++i)
g[i] = add(i ? g[i - 1] : 0, Lagrange(f, (1ll * a + 1ll * i * d) % P, k + 4));
cout << Lagrange(g, n, k + 4) << '\n';
}
return 0;
}