51nod-1161 Partial Sums

原题链接

题目来源:  CodeForces
基准时间限制:2 秒 空间限制:131072 KB 分值: 80  难度:5级算法题
 收藏
 关注
给出一个数组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

已知数列1, 0, 0, 0.......

执行k次操作后变为c(k, 0), c(k, 1), c(k+1, 2), c(k+2 3), c(k+3, 4), c(k+4, 5)...

这就是1这个数字对后面每个数字的贡献值

对于题中给出的数列,只要算出每个数对后面数字的贡献值即可

#include <bits/stdc++.h>
#define maxn 5005
#define MOD 1000000007
using namespace std;
typedef long long ll;

int n, k;
ll d1[maxn], d2[maxn], tt[maxn];
ll uu[maxn];
ll Get(ll p){
	
	ll ans = 1, m = MOD - 2;
	while(m){
		if(m&1)
		 (ans *= p) %= MOD;
		 (p *= p) %= MOD;
		 m >>= 1;
	}
	return ans;
}
void Init(){
	d1[1] = 1;
	for(int i = 2; i <= n; i++)
	 d1[i] = d1[i-1] * i % MOD;
	d2[0] = 1;
	for(int i = 1; i < n; i++)
	 d2[i] = d2[i-1] * (i + k - 1) % MOD;
    tt[0] = 1;
	for(int i = 1; i < n; i++)
	 tt[i] = d2[i] * Get(d1[i]) % MOD;
}
int main(){
	
//	freopen("in.txt", "r", stdin);
	ll a;
	scanf("%d%d", &n, &k);
	Init();
	for(int i = 0; i < n; i++){
		scanf("%I64d", &a);
		for(int j = 0; j < n - i; j++){
			uu[j+i] += tt[j] * a % MOD;
			uu[j+i] %= MOD;
		}
	}
	for(int i = 0; i < n; i++)
	 printf("%I64d\n", uu[i]);
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值