线性代数,概率与期望题单

这篇博客通过一系列编程竞赛题目,展示了线性代数和概率论在解决复杂问题中的应用。包括计算Beautiful Bracket Sequence的深度和、预期碰撞时间、随机购买策略的期望成本以及逆序对期望数量的分析。还涉及到了从离散变量到正态分布的概率转换,利用多项式快速幂解决实际问题。每道题目都提供了深入的解析和AC代码,揭示了数学在算法设计中的重要性。
摘要由CSDN通过智能技术生成

Beautiful Bracket Sequence (hard version)

题意:给出一个包含 ( ) ? ()? ()?的字符串,求将 ? ? ?变为 ( ) () ()之一的所有方案中,字符串的深度和。深度 d d d为其子序列中最长的为 2 ∗ d 2*d 2d的字符串其中前 d d d位都是 ( ( ( d d d位都是 ) ) )

发现一个性质这题就很好做了。
对于一个只有 ( ) () ()的字符串,一定只有一个点 x x x,满足它左边 1... x 1...x 1...x的左括号数等于 x + 1... n x+1...n x+1...n的右括号数,并且这个字符串的深度就是它左边的左括号数。
那么我们枚举每个位置 x x x,假设左边有 a a a个左括号,有 c c c个问号,右边有 y y y个右括号, z z z个问号。
则答案为 ∑ i = max ⁡ ( a , y ) min ⁡ ( a + c , y + z ) i ( c i − a ) ( z i − y ) \sum_{i=\max(a,y)}^{\min(a+c,y+z)}i\binom{c}{i-a}\binom z{i-y} i=max(a,y)min(a+c,y+z)i(iac)(iyz)
发现因为组合数下标为0或者大于上标都为 0 0 0,可以把式子写成枚举范围易于范德蒙德卷积的形式:
∑ i i ( c i − a ) ( z z + y − i ) = ∑ ( i − a ) ( c i − a ) ( z z + y − i ) + a ∑ ( c i − a ) ( z z + y − i ) \sum_i i \binom c{i-a} \binom z{z+y-i} = \sum (i-a)\binom c{i-a} \binom z{z+y-i} + a\sum \binom c{i-a} \binom z{z+y-i} ii(iac)(z+yiz)=(ia)(iac)(z+yiz)+a(iac)(z+yiz)
= ∑ c ( c − 1 i − a − 1 ) ( z z + y − i ) + a ( c + z z + y − a ) =\sum c\binom {c-1}{i-a-1}\binom z{z+y-i} + a \binom {c+z}{z+y-a} =c(ia1c1)(z+yiz)+a(z+yac+z)
= c ( c + z − 1 z + y − a − 1 ) + a ( c + z z + y − a ) = c\binom {c+z-1}{z+y-a-1} + a\binom {c+z}{z+y-a} =c(z+ya1c+z1)+a(z+yac+z)
A C   C o d e \mathcal AC \ Code AC Code

#include<bits/stdc++.h>
#define maxn 1000006
#define rep(i,j,k) for(int i=(j),LIM=(k);i<=LIM;i++)
#define mod 998244353
using namespace std;

int n,fac[maxn],inv[maxn],invf[maxn];
char s[maxn];

int C(int a,int b){
    if(a<0||b<0||a<b) return 0;return fac[a] * 1ll * invf[b] % mod * invf[a-b] % mod; }

int main(){
   
	scanf("%s",s);
	n=strlen(s);
	fac[0]=fac[1]=inv[0]=inv[1]=invf[0]=invf[1]=1;
	rep(i,2,n) fac[i] = 1ll * fac[i-1] * i % mod , inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod,
		invf[i] = 1ll * invf[i-1] * inv[i] % mod;
	int a=0,c=0,y=0,z=0;
	rep(i,0,n-1){
   
		if(s[i] == ')') y++;
		if(s[i] == '?') z++;
	}
	int ans = 0;
	rep(i,0,n-1){
   
		if(s[i] == '(') a ++;
		else if(s[i] == ')') y --;
		else c ++ , z -- ;
		ans = (ans + 1ll * a * C(z+c,z+y-a) + 1ll * c * C(z+c-1,z+y-a-1)) % mod;
	}
	printf("%d\n",(ans+mod)%mod);
}

CF1286D LCC

数轴上有 n n n个粒子,每个有 v i v_i vi的初速度,有<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值