[egin{align}
sum_{k=0}^nsum_{j=0}^ma_jk^j imes x^k imes inom nk
end{align}
]
把 f(k) 转为下降幂多项式:
[egin{align}
&sum_{k=0}^nsum_{j=0}^mb_jk^{underline j} imes x^k imes inom nk\
&sum_{k=0}^nsum_{j=0}^mb_jn^{underline j} imes x^k imes inom{n-j}{k-j}\
&sum_{j=0}^mb_jn^{underline j} sum_{k=0}^n x^k imes inom{n-j}{n-k}\
&sum_{j=0}^mb_jn^{underline j} x^jsum_{k=0}^{n-j} x^{n-j-k} imes inom{n-j}{k}\
&sum_{j=0}^mb_jn^{underline j} x^j(1+x)^{n-j}
end{align}
]
很妙。
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int M = 2e3 + 3;
int mo;
int ksm(int a, int b) {
int res = 1;
for(; b; b>>=1, a=((LL)a*a) % mo)
if(b & 1) res = ((LL)res * a) % mo;
return res;
}
int n, m, x;
int a[M], b[M], S[M][M];
int main()
{
scanf("%d%d%d%d", &n, &x, &mo, &m);
for(int i = 0; i <= m; ++i) scanf("%d", &a[i]);
S[0][0] = 1;
for(int i = 1; i <= m; ++i) {
for(int j = 1; j <= i; ++j) {
S[i][j] = ((LL)j * S[i-1][j] % mo + S[i-1][j-1]) % mo;
}
}
for(int i = 0; i <= m; ++i) {
for(int j = 0; j <= i; ++j) {
b[j] += (LL)S[i][j] * a[i] % mo;
b[j] %= mo;
}
}
LL ans = 0ll;
int n_f_j = 1;
for(int j = 0; j <= m; ++j) {
ans += (LL)b[j] * (LL)n_f_j % mo * (LL)ksm(x, j) % mo * (LL)ksm(x + 1, n - j) % mo;
ans %= mo;
n_f_j = (LL)n_f_j * (LL)(n-j) % mo;
}
cout << ans;
return 0;
}