其他分享
首页 > 其他分享> > CF223C Partial Sums

CF223C Partial Sums

作者:互联网

将前缀和看成乘上 \(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