描述
题解
如果暴力解题是肯定不行的,这个需要算出每个 A[i] 对第 K 次操作的贡献,根据前几次操作的模拟结果可以得出,这是一个组合数,于是乎也就变成了一个如何快速求组合的问题了。
对于这道题我也是一知半解,主要是组合数学学得有些差,求组合只会套模版,这就很尴尬了~~~哎呀,我要去看组合数学啦!
最后,在这里,必须感谢 ITAK 大神的题解。
代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int MAXN = 5e3 + 5;
const int MOD = 1e9 + 7;
ll A[MAXN], inv[MAXN];
void getInv()
{
inv[1] = 1;
for (int i = 2; i < MAXN; i++)
{
inv[i] = ((MOD - MOD / i) * inv[MOD % i]) % MOD;
}
}
ll res[MAXN];
void init(int n, int k)
{
res[0] = 1;
for (int i = 1; i <= n; i++)
{
res[i] = ((res[i - 1] * (k - 1 + i) % MOD) * inv[i]) % MOD;
}
}
int main()
{
getInv();
int n, k;
while (~scanf("%d%d", &n, &k))
{
for (int i = 1; i <= n; i++)
{
scanf("%lld", &A[i]);
}
init(n, k);
for (int i = 1; i <= n; i++)
{
ll sum = 0;
for (int j = 1; j <= i; j++)
{
sum = (sum + res[i - j] * A[j] % MOD + MOD) % MOD;
}
if (i == n)
{
printf("%lld ", sum);
}
else
{
printf("%lld\n", sum);
}
}
}
return 0;
}