给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}。如果对生成的数组S再进行一次累加操作,{1 4 9 15} => {1 5 14 29},现在给出数组A,问进行K次操作后的结果。(每次累加后的结果 mod 10^9 + 7)
Input
第1行,2个数N和K,中间用空格分隔,N表示数组的长度,K表示处理的次数(2 <= n <= 5000, 0 <= k <= 10^9, 0 <= a[i] <= 10^9)
Output
共N行,每行一个数,对应经过K次处理后的结果。每次累加后mod 10^9 + 7。
Input示例
4 2
1
3
5
6
Output示例
1
5
14
29
思路:
经过k次变换后,a[j]在i上的累加是a[j]*C(i-j+k-1,k-1)。
可以用递推公式
C(n+1, m)=C(n, m) * (n+1) / (n-m+1)
计算组合数。
计算除法取模时利用逆元。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
const int MAXN = 5050;
ll a[MAXN], w[MAXN];
ll q_pow(ll x, ll p)
{
ll ret = 1;
while (p)
{
if(p & 1)
{
ret = x * ret % MOD;
}
p >>= 1;
x = x * x % MOD;
}
return ret;
}
void getInv(ll v)
{
w[0] = 1;
}
int main()
{
ll i, j, n, k, ans, tmp;
cin >> n >> k;
for(i = 1; i <= n; i++)
{
cin >> a[i];
}
w[0] = 1;
tmp = 1;
for (i = 1; i < n; i++)
{
tmp = tmp * (i + k - 1) % MOD * q_pow(i, MOD - 2) % MOD;
w[i] += tmp;
if (w[i] > MOD)
{
w[i] %= MOD;
}
}
for (i = 1; i <= n; i++)
{
ans = 0;
for (j = i; j >= 1; j--)
{
ans = (ans + (w[i-j] * a[j]) % MOD) % MOD;
}
cout << ans << endl;
}
return 0;
}