首页 > 其他分享 >Jellyfish and OEIS

Jellyfish and OEIS

时间:2023-12-21 09:45:28浏览次数:24  
标签:OEIS forn int MAXN mul 我们 dp Jellyfish

Jellyfish and OEIS

题意

题面传送门

题解

恭恭敬敬给致远磕大头。

首先我们将原序列分割成很多块,使得每一块都是相对位置的排列。且这一块内不可分割出另外的块。

例如:\([3,1,2][5,4]\),而 \([1,2,3]\) 是不合法的,因为他可以被分割为 \([1][2][3]\)。

在进行这一步操作之后,我们发现我们的序列被划分成了很多中括号。而需要满足的条件即为:\(r_i> m_{l_i}\) 。

我们进一步思考之后发现这有点问题。

\([3,2,1]\),这个排列。

我们发现虽然他整体是一个部分,但是中间的 \(2\) ,同样也是一个在位置上的排列,那么我们此时就获得了嵌套:

\([3,[2],1]\)。

我们进一步思考性质,会发现一个非常显然而又经典事情:所有的括号只包含或相离而不相交。

这个是显然的。

这时候我们将整张图画出来,会发现我们的图形成了一个森林。

img

这时候我们得到了树状结构,那么如果我们可以解决由某一层递推到上一层的问题。那整道题目就迎刃而解了。

此时我们考虑嵌套的充要条件是什么:

首先下一层的 \([\ ]\) 我们不去管它,那剩下的位置呢?

经过思考后我们可以发现剩下的位置一定要满足他任意一个子序列都必须满足它里面的元素不是他的排列,即

即他是一个单层机构,只能被表达为 \([a_1,a_2,...,a_n]\)。

充分性是显然的:如果满足这个条件,那么一定框不出来,那么满足就一定合法。

接下来证明必要性:

在这里我们证明逆否条件:若不满足则一定不合法:

假设我们发现有一段 \([l,r]\) 不满足条件,即 \([a_l,...,a_r]\) 是 \([l,...,r]\) 的一个排列,那么我们此时可以将这一段框起来,那这就与下一层外没有嵌套相违背了,所以逆否条件得证,则原命题得证。

这样我们只要能够求出 \(h(n)\):即任意一个子序列都必须满足它里面的元素不是他的排列的个数,我们就可以解决这道题了。

“那么我们按照题目要求我们做的。”

我们通过打表打出前 7 项 \(h(n)\) ,然后oeis,就能够得到 \(h(n)\) 的公式:

\(h(n)=(n-1)h(n-1)+\sum_{j=2}^{n-2}(j-1)\cdot h_j\cdot h_{n-j}\)

具体证明在这里不作解释。

那么此时我们整理一下式子:

设 \(dp_{l,r}\) 表示区间 \([l,r]\) 是合法的区间的方案数,\(f_{l,r,p}\) 用来辅助转移,表示 \([l,r]\) 这个区间,下一层空了 \(p\) 个位置的方案数。

转移是简单的:

\(dp_{l,r}=\sum_{p=2}^{len}h(p)\cdot f_{l+1,r-1,p-2}\)(因为我们要保证最左端和最右端不是括号组成的,否则就会分裂出去了)

当然要特判 \(l=r\) 的情况以及 \(r\) 是否 \(>m_l\) 。

\(f_{l,r,p}=f_{l,r-1,p-1}+\sum_{t=1}^{len}f_{l,r-t,p}\cdot dp_{r-t+1,r}\)

最后输出 \(f_{1,n,0}\) 就是答案(因为我们的最终序列是森林)。

代码

//think twice,code once
//think once,debug forever
const int MAXN=220,mod=1e9+7;
int h[MAXN];
int F[MAXN];
int a[MAXN];
int dp[MAXN][MAXN];
int f[MAXN][MAXN][MAXN];
int n;
void init()
{
	h[1]=1;
	forn(i,2,200)
	{
		h[i]=mul(i-1,h[i-1]);
		forn(j,2,i-2)
		{
			h[i]+=mul(j-1,mul(h[j],h[i-j]));modcg(h[i]);
		}
	}
}
void solve()
{
	MOD.init(mod);
	init();
	cin>>n;
	forn(i,1,n)
	{
		cin>>a[i];
	}
	if(a[1]==n)
	{
		cout<<0<<endl;
		return; 
	} 
	forn(l,1,n)
	{
		f[l][l-1][0]=1;
	}
	forn(len,1,n)
	{
		forn(l,1,n)
		{
			int r=l+len-1;
			if(r>n)
			{
				break;
			}
			if(r>a[l])
			{
				if(l==r)
				{
					dp[l][r]=1;	
				}
				else
				{
					forn(p,2,len)
					{
						dp[l][r]+=mul(h[p],f[l+1][r-1][p-2]);modcg(dp[l][r]);	
					}
				}
			}
			forn(p,0,len)
			{
				if(p)
				{
					f[l][r][p]+=f[l][r-1][p-1];modcg(f[l][r][p]);
				}
				forn(t,1,len)
				{
					f[l][r][p]+=mul(f[l][r-t][p],dp[r-t+1][r]);modcg(f[l][r][p]);
				}
			}
		}
	}
	cout<<f[1][n][0]<<endl;
}

标签:OEIS,forn,int,MAXN,mul,我们,dp,Jellyfish
From: https://www.cnblogs.com/hawkrad/p/17918303.html

相关文章

  • 1-1875D - Jellyfish and Mex
    题意:有一个长度为\(n\)的数组,每次删除一个数直到删完,求每次删除后数组的mex的和的最小值。(\(\sumn\leq5000,a_i\leq10^9\))思路:排序后,只有从0开始连续的数在会有贡献,对于连续的数,如果要消去他的对答案的贡献,只有全部去掉才行,考虑n的范围小于5000,n^2做法被允许。//因为排......
  • CF1874F Jellyfish and OEIS 题解
    题目链接不明白出题人的脑回路是不是被宇宙射线改变过/jy。题目给出了若干个区间,要我们计算满足每个区间都不是对应下标的排列的数量,正着计算不满足要求的数量是困难的,我们将其容斥,转化为钦定一些区间要求其必须满足它是对应下标的排列,在下文中,我们称这样的区间为一个约束。我......
  • Codeforces Round 901 (Div. 2) C. Jellyfish and Green Apple (位运算)
    CodeforcesRound901(Div.2)C.JellyfishandGreenApple//思路:浮点数转二进制,a/b的结果为gcd(a,b)*最简分式(n/m)的结果//苹果能分的前提是人数得是一个2的次幂数,通过切割只能分为形同0.001的二进制小数//a/b的二进制如果在从左到右的sp位为1,则需要切割到这个情况//一个......
  • [CF1874D] Jellyfish and Miku
    JellyfishandMikuD<C<B,哈哈。设\(dp_i\)为起点为i时的期望步数,则\[dp_0=1+dp_1\\dp_n=0\\dp_i=1+\frac{a_{i-1}}{a_{i-1}+a_i}dp_{i-1}+\frac{a_{i-1}}{a_{i-1}+a_i}dp_{i+1}\]化简第三个式子可得\[a_{i+1}(dp_i-dp_{i+1})=a_i(dp_{i-1}-dp_i)+a_i+a_{i+1}\]设\(......
  • Codeforces 1874F - Jellyfish and OEIS
    考虑对\(\summ_i-i+1\)个不可行的集合进行容斥,即钦定一些区间集,要求它们对应的\(p_l,p_{l+1},\cdots,p_r\)必须是\([l,r]\)的排列,计算方案数乘以容斥系数之和。如果容斥的集合中存在相交的区间,那么这个方案数其实不太好计算。不过根据区间的性质,对于\(l_1<l_2\ler_1<r_2......
  • CF1874C Jellyfish and EVA 题解
    题意给定一个有向无环图,对于任意一条边\((u_i,v_i)\),有\(u_i<v_i\)。定义一次从节点\(u\)开始的移动为如下过程:\(\tt{Alice}\)选择从\(u\)出发的且未被删除的一条边。\(\tt{Bob}\)在从\(u\)出发的且未被删除的边中等概率随机选择一条。若两人选择的边相同......
  • CodeForces 1874B Jellyfish and Math
    洛谷传送门CF传送门看到这种操作乱七八糟不能直接算的题,可以考虑最短路。对于\(a,b,c,d,m\)按位考虑,发现相同的\((a,b,m)\)无论如何操作必然还是相同的。于是考虑对于每个可能的\((0/1,0/1,0/1)\),所有终态有\((c=0/1,d=0/1)\)或者不确定。这样我们对于一......
  • Jellyfish and Mex
    2023-10-01题目JellyfishandMex难度&重要性(1~10):5题目来源luogu题目算法dp解题思路这道题一眼dp。我们需要考虑的是对于函数\(\operatorname{mex}\)的性质,假设当前\(a\)数组存在\(0\simx\),则\(\operatorname{mex}a=x+1\)。再记每一个数出现过\(s_0,s_1,\cd......
  • CF1875B Jellyfish and Game
    思路题意大概是两人都有一组数,奇数轮,第一个人可以选择和第二个人交换一个数字也可以不换,偶数轮,第二个人可以选择和第一个人交换一个数字也可以不换。首先可以猜测,我们每次都应该选择交换对方的最大值和自己的最小值,如果自己的最小值都比对方大的话就不交换。应该比较好想,这里感......
  • CF1875D Jellyfish and Mex
    思路看到\(n\)的范围只有\(5000\),并且\(\sumn\)的范围也是\(5000\),所以可以考虑\(n^2\)的做法。每次操作肯定都是一次性删完某个数字,如果删除某个数字删一半又去删别的数字,答案肯定会变大。所以我们可以考虑统计所有数字的数量,记为\(num_i\),来计算删完某个数字的最小......