CF1696E 题解

CF1696E

思路

数学题。

答案是唯一的。操作过程从左上到右下不可逆。每个点操作次数的贡献即每个点数的最大值。

类似于递推:

dpi,0=dp0,i=1

dpi,j=dpi1,j+dpi,j1

则答案为划定范围内所有 dp 数组值的和。

但这样是 O(n2) 的。

又发现斜着看这其实是杨辉三角。

Ci+ji=dpi,j

ans=i=0nj=0ai1Ci+ji=i=0nj=0ai1dpi,j

经过打表和 OEIS,发现:

j=0ai1dpi,j=dpi+1,ai1

补证明:

j=0ai1dpi,j=dpi,0+j=1ai1dpi,j=dpi+1,0+j=1ai1dpi,j=dpi+1,ai1

于是可以 O(n)

code

int n,a[maxn],ans;
int pw[maxn],inv[maxn];
inline int ksm(int a,int b){
	int ans=1;
	while(b){
		if(b&1)ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}
int C(int m,int n){
	return pw[m]*inv[n]%mod*inv[m-n]%mod;
}

signed main(){
	n=read();
	for(int i=0;i<=n;i++)a[i]=read();
	pw[0]=inv[0]=1;
	for(int i=1;i<=maxn-10;i++)pw[i]=pw[i-1]*i%mod,inv[i]=ksm(pw[i],mod-2);
	for(int i=0;i<=n;i++)ans+=C(a[i]+i,i+1),ans%=mod;
	printf("%lld\n",ans);
}

posted @   yhddd  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示