首页 > 其他分享 >CF1781F题解

CF1781F题解

时间:2023-05-20 10:36:34浏览次数:52  
标签:dbinom limits CF1781F int 题解 sum 1ll mod

\(\text{link}\) 。也是一道非常巧妙的 \(\texttt{dp}\) 。

容易想到把括号变成 \(\pm 1\)。考虑括号序列合法等价于前缀和 \(\ge 0\),我们可以想加入 \(()\) 或 \()(\) 对前缀的影响。

设加入的位置的前一位前缀和为 \(x\),则加入 \(()\) 相当于把 \(x\) 替换为 \([x,x+1,x]\),加入 \()(\) 相当于把 \(x\) 替换为 \([x,x-1,x]\)。

则原问题等价于初始给定一个集合 \(S={0}\),有 \(n\) 次操作,每次等概率地选择集合中的一个元素 \(x\),并有 \(p\) 的概率把 \(x,x+1\) 加入 \(S\),有 \(1-p\) 的概率把 \(x,x-1\) 加入 \(S\),求\(n\) 次操作后 \(S\) 中所有元素非负的概率。

显然概率转方案,最终除以 \((2n-1)!!\)。

令 \(f_{n,x}\) 表示进行了 \(n\) 次操作,初始在集合中的数为 \(x\) 的方案数,最终答案就是 \(\dfrac{f_{n,0}}{(2n-1)!!}\)。则

\(f_{n,x}=p\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1-i}\dfrac{(n-1)!}{i!j!(n-1-i-j)!}f_{i,x}f_{j,x+1}f_{n-1-i-j,x}+ (1-p)\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{n-1-i}\dfrac{(n-1)!}{i!j!(n-1-i-j)!}f_{i,x}f_{j,x-1}f_{n-1-i-j,x}\)

解释一下:比如果加入 \(x,x+1\) 是求方案数,我们就枚举新加入的 \(x,x+1\) 在之后基于它们各进行了几次操作,就是枚举 \(i,j\),然后剩下的 \(n-1-i-j\) 次操作就是基于原来在集合中的 \(x\) 操作。

由于顺序不一定要乘上一个系数(就是那里的阶乘)。加号右半边也是同理。

这时复杂度是 \(O(n^4)\) ,不能接受,显然考虑前缀和优化。

我们发现加号左右两边很像啊,于是考虑交换求和顺序,先枚举 \(j\),这时 \(\dfrac{(n-1)!}{i!j!(n-1-i-j)!}\) 我们把它变为 \(\dbinom{n-1}{j}\dbinom{n-1-j}{i}\) 。

则 \(f_{n,x}=\sum\limits_{j=0}^{n-1}\dbinom{n-1}{j}(pf_{j,x+1}+(1-p)f_{j,x-1})\sum\limits_{i=0}^{n-1-i-j}\dbinom{n-1-j}{i}f_{i,x}f_{n-1-i-j,x}\) 。

令 \(g_{n,x}=\sum\limits_{i=0}^{n}\dbinom{n}{i}f_{i,x}f_{n-i,x}\),则 \(f_{n,x}=\sum\limits_{j=0}^{n-1}\dbinom{n-1}{j}(pf_{j,x+1}+(1-p)f_{j,x-1})g_{n-1-j}\) 。

这样复杂度就是 \(O(n^3)\) 了,可以接受。

有一点要注意,就是初始化我们要假设所有 \(f_{0,x}\) 都为 \(1\),因为我们这样 \(\texttt{dp}\) 是假定初始所有数都可能出现。这样所有 \(g_{0,x}=1\) 。

$\texttt{code}$
#include<bits/stdc++.h>
#define LL long long
#define fr(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
const int N=505,mod=998244353;
int n,p,P,jc[N],inv[N],f[N][N],g[N][N],s=1;
inline int ksm(int x,int p){int s=1;for(;p;(p&1)&&(s=1ll*s*x%mod),x=1ll*x*x%mod,p>>=1);return s;}
inline int C(int n,int m){return 1ll*jc[n]*inv[m]%mod*inv[n-m]%mod;}
int main()
{
	scanf("%d%d",&n,&p);p=796898467ll*p%mod;P=(mod+1-p)%mod;
	jc[0]=1;for(int i=1;i<=n;i++) jc[i]=1ll*jc[i-1]*i%mod;
	inv[n]=ksm(jc[n],mod-2);for(int i=n-1;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
	for(int i=0;i<=n;i++) f[0][i]=g[0][i]=1;for(int i=1;i<=n*2;i+=2) s=1ll*s*i%mod;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=n;j++)//f{i,j}
		{
			for(int k=0;k<=i-1;k++) f[i][j]=(f[i][j]+(1ll*p*f[k][j+1]+(j>0?1ll*P*f[k][j-1]:0))%mod*C(i-1,k)%mod*g[i-1-k][j])%mod;
			for(int k=0;k<=i;k++) g[i][j]=(g[i][j]+1ll*C(i,k)*f[k][j]%mod*f[i-k][j])%mod;
		}
	printf("%d",1ll*f[n][0]*ksm(s,mod-2)%mod);
	return 0;
}

<\details>

标签:dbinom,limits,CF1781F,int,题解,sum,1ll,mod
From: https://www.cnblogs.com/HaHeHyt/p/17416853.html

相关文章

  • CSP-J2021试题题解
    1.分糖果原题:https://www.luogu.com.cn/problem/P7909原代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;lln,l,r;intmain(){ cin>>n>>l>>r; if(r%n==n-1)cout<<n-1; elseif(l%n==n-1)cout<<n-1; elseif(......
  • 问题解一
    (1)用pycharm连接mysql时,需要安装一个驱动,点击连接界面,如果TestConnection不可用,点击右边的按钮即可(2)如果要将同一网站不同链接的数据存入数据库,可考虑重写start_requestseg:forindex,hrefinenumerate(self.start_urls):ifindex==0:yieldscrapy.Request(......
  • 僵尸进程问题解决
    1何为僵尸进程僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出,子进程被init接管,子进程退出后init会回收其占用的相关资源。在UNIX系统中,一个进程结束了,但是它的父进程没有等待(调用wait/wai......
  • 【P4331 [BalticOI 2004]】Sequence 数字序列 题解(左偏树维护动态区间中位数)
    左偏树维护动态区间中位数。传送门P4331BalticOI2004Sequence数字序列。Solution1我的思路和题解前半部分完全重合了((如果按照单调不增去分割\(a\)序列的话,对于每一段我们能很简单地得出它的最佳答案:中位数。发现严格单调很难做,很难拿捏,考虑对\(a\)序列的每一项都进......
  • CSP-J2022山东补赛题解
    1.植树节原题:https://www.luogu.com.cn/problem/U285015代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e6+255;inta[N],n,x,y,maxb=-1e9,ans=-1e9;intmain(){ cin>>n; for(inti=1;i<=n;i++){ cin>>x&g......
  • CSP-J2019试题题解
    1.数字游戏原题:https://www.luogu.com.cn/problem/P5660代码:#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;strings;intmain(){ cin>>s;intnum=0; fo......
  • CF1512C A-B Palindrome 题解
    CF1512CA-BPalindrome题解Link洛谷CodeforcesDescription给出\(T\)个只由0、1和?组成的字符串\(s\),将字符串中的?替换成0或1之后形成一个回文串并且恰好有\(a\)个0和\(b\)个1,无解输出-1。Solution首先,若不考虑?原串不为回文串一定无解,输出-1即......
  • CF1512D Corrupted Array 题解
    CF1512DCorruptedArray题解Link洛谷CodeforcesDescription给定一个正整数\(n\)和长度为\(n+2\)的数组\(b\),数组\(b\)是依据如下算法构造的:随机生成一个含有\(n\)个元素的原始数组\(a\);把数组\(a\)赋值给数组\(b\),即\(b_i=a_i(1\lei\len)\);数组\(b\)......
  • 【题解】第五届图灵杯
    //createdon23.05.13目录A.差值B.基础循环结构练习题C.基础计算几何练习题D.永恒悲剧A.差值考虑求长度为\(i\)的答案,肯定是长度\(\geqi\)的后缀,按照字典序排序后,相邻两个求解。所以考虑倒着扫,每次对于\(i\)的后缀找到排名前后第一个后缀,求出两个长度为\(i\)......
  • GYM104363 2023 ccpc 黑龙江省赛 题解
    比赛链接:https://codeforces.com/gym/104363题解:B//bySkyRainWind#include<bits/stdc++.h>#definemprmake_pair#definedebug()cerr<<"Yoshino\n"#definepiipair<int,int>#definepbpush_backusingnamespacestd;typedeflong......