ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF223C Partial Sums

2022-07-14 14:33:06  阅读:100  来源: 互联网

标签:Partial int res sum Sums long ans define CF223C


将前缀和看成乘上 \(1+x+x^1+x^2+...+x^n\),快速幂加多项式乘法即可。

考虑先前缀和一次,将 \(k-1\)。

考虑记 \(k\) 阶前缀和为 \(sum_{(k,i)}\)

那么 \(sum_{(k,i)}=sum_{(k,i-1)}+sum_{(k-1,i)}\)

抽象成网格图上的游走,每次可以向下或者向右走一格。

第一行的点对第 \(k\) 行的点的贡献就是每次不同方式走到那就贡献 \(+1\),即路径数。

于是先做一次前缀和,将 \(k-1\),那么对于 \((1,j)\) 走到 \((k,i)\) 的方案数就是 \(C^{i-j}_{k+i-j-1}\)

预处理下差值阶乘即可。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int mod=(int)(1e9+7),N=2005;
int a[N],b[N],ans[N],tmp[N],n,k;

int fpow(int x,int y) {
	int res=1;
	while(y) {
		if(y&1) res=res*x%mod;
		y>>=1; x=x*x%mod;
	} return res;
}
int djie[N],jie[N],jjie[N];
int C(int n,int m) {
	if(m>n||n<0) return 0;
	int res=djie[m]*jjie[n-(n-m+1)+1]%mod;
	return res;
}
//jie[n]*djie[m]*djie[n-m]

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	cin>>n>>k;
	djie[0]=jie[0]=1;
	for(int i=1;i<=n;i++) jie[i]=jie[i-1]*i%mod,djie[i]=fpow(jie[i],mod-2);
	for(int i=1;i<=n;i++) {
		cin>>a[i];
//		b[i]=ans[i]=1;
	}
	if(!k) {
		for(int i=1;i<=n;i++) cout<<a[i]<<' ';
		return 0;
	}
	for(int i=1;i<=n;i++) a[i]=(a[i-1]+a[i])%mod;
	--k;
	if(!k) {
		for(int i=1;i<=n;i++) cout<<a[i]<<' ';
		return 0;
	}
	jjie[0]=1; for(int i=1;i<=n;i++) jjie[i]=jjie[i-1]*(k+i-1)%mod;
	for(int i=1;i<=n;i++) {
		int qwq=0;
		for(int j=1;j<=i;j++) {
//			cout<<i<<" "<<j<<" "<<C(k+i-j-1,i-j)<<'\n';
			qwq=(qwq+C(k+i-j-1,i-j)*a[j]%mod)%mod;
		}
		cout<<qwq<<' ';
	}
	// (1,j)->(k,i)
	return 0;
}


#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
const int mod=(int)(1e9+7),N=2005;
int a[N],b[N],ans[N],tmp[N],n,k;

void mul(int *f,int *g) {
	for(int i=0;i<=n;i++) tmp[i]=0;
	for(int i=0;i<=n;i++) {
		for(int j=0;j+i<=n;j++) {
			tmp[j+i]=(tmp[j+i]+f[i]*g[j]%mod)%mod;	
		}
	}
	for(int i=0;i<=n;i++) f[i]=tmp[i];
}

signed main() {
	cin.tie(0); ios::sync_with_stdio(false);
	cin>>n>>k;
	b[0]=ans[0]=1;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
		b[i]=ans[i]=1;
	}
	if(!k) {
		for(int i=1;i<=n;i++) cout<<a[i]<<' ';
		return 0;
	}
	--k;
	while(k) {
		if(k&1) mul(ans,b);
		mul(b,b); k>>=1;
	}
	mul(a,ans);
	for(int i=1;i<=n;i++) cout<<a[i]<<' ';
	return 0;
}

标签:Partial,int,res,sum,Sums,long,ans,define,CF223C
来源: https://www.cnblogs.com/xugangfan/p/16477548.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有