首页 > 其他分享 >CF1874F Jellyfish and OEIS 题解

CF1874F Jellyfish and OEIS 题解

时间:2023-11-01 11:23:32浏览次数:39  
标签:方案 ch OEIS CF1874F 题解 容斥 约束 系数 区间

题目链接

不明白出题人的脑回路是不是被宇宙射线改变过 /jy。

题目给出了若干个区间,要我们计算满足每个区间都不是对应下标的排列的数量,正着计算不满足要求的数量是困难的,我们将其容斥,转化为钦定一些区间要求其必须满足它是对应下标的排列,在下文中,我们称这样的区间为一个约束

我们设约束的集合为 \(U\),设 \(f(S)\) 表示属于 \(S\) 的约束必须满足,其它不作要求的排列个数,转化后的答案可以表示为:

\[\sum_{S\subset U}^{U} (-1)^{|U|-|S|} f(S) \]

尽管题目中给定的 \(S\) 在一定程度上是连续的,但是如果一组约束中出现了相交的约束就会让求解变得困难,我们可以先考虑两个相交的约束有什么性质。

观察到如果两组约束 \([l_1,r_1]\)、\([l_2,r_2]\) 满足 \(l_1 <l_2 <r_1<r_2\) 那么我们可以将其拆为 \([l_1,l_2-1]\)、\([l_2,r_1]\)、\([r_1+1,r_2]\) 三组不交的约束,且约束力等价,对于更多的约束我们同样可以这么拆分。

更进一步地,每拆分一次后,容斥系数都会改变,且方案数仍然不变,如果 \([r_1+1,r_2]\) 这组约束满足 \(r_2 \leq m_{r_1+1}\) 拆分前后的贡献就会相互抵消。

这启发我们考虑使一些存在相交约束的 \(S\) 的贡献与其他的相消,继续考虑上述的拆分过程,虽然 \([r_1+1,r_2]\) 不一定合法,但是 \([l_1,l_2-1]\) 一定是合法的,拆分前如果不存在这个区间,这组方案就与加上这个区间的方案约束力相同容斥系数相反。

我们上述的描述实际上构建了一个有相交区间集合到其本身的双射,且对应集合约束力相同容斥系数相反,贡献可以相互抵消,于是我们就可以不用考虑有相交区间的 \(S\) 的贡献。

如果我们拉出一个剩下的 \(S\),可以发现区间现在只有包含和不交两种关系,构成了一个树形结构,我们可以考虑使用区间 dp 批量计算这样的贡献。

具体地,设 \(f_{l,r}\) 表示 \([l,r]\) 这个区间的数是其下标的一个排列时包含于其中的钦定方案的方案数乘容斥系数之和,但是我们强制选择 \([l,r]\) 且不考虑其容斥系数,这等价于计算区间 \([l,r]\) 其本身的答案。设 \(g_{l,r,x}\) 表示 \([l,r]\) 这个区间有 \(x\) 个没有被覆盖到的点的的钦定方案的方案数乘容斥系数之和,有转移:

\[\sum_{x=0}^{r-l+1} g_{l,r,x}\times x! \rightarrow f_{l,r} \]

\[g_{l+1,r,x+1}+\sum_{k=l}^{min(r-l,m_l)}(-f_{l,k})\times g_{k+1,r,x} \rightarrow g_{l,r,x} \]

\[g_{l,r,0}-f_{l,r}\rightarrow g_{l,r,0} \]

其中第一个式子由定义易得,而考虑我们安排 \([l,r]\) 的方案时是要在左边放一个散点还是拼上一个区间,前面要加上负号是因为在计算 \(f_{l,r}\) 时我们没有考虑 \([l,r]\) 所带来的容斥系数,我们拼上 \([l,r]\) 的意义是选择 \([l,r]\) 的所有钦定方案数之外,强制加上我们计算 \(f_{l,r}\) 时没有选择的 \([l,r]\) ,不选择 \([l,r]\),只选择小区间的情况会在逐个拼接小区间的情况中被考虑,这里多加了个区间要乘上 \(-1\)。

最后,由于计算 \(g_{l,r,0}\) 时我们没有考虑选择整体区间 \([l,r]\) 的情况,所以最后 \(g_{l,r,0}\) 还要减去 \(f_{l,r}\) 表示加上选择 \([l,r]\) 的方案数乘上多选带来的 \(-1\)。

初值: \(g_{i,i,1}=1\) 和 \(g_{i,i,0}=-1\),你也可以在代码中写成 \(g_{i,i-1,1}=1\)。

答案: \(f_{l,r}\)。

时间复杂度 \(O(n^4)\)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 205
#define mod 1000000007
#define ll long long
using namespace std;
ll f[N][N],g[N][N][N];
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
ll m[N],fac[N];
int main(){
	ll n=read();
	for(ll i=1;i<=n;i++)m[i]=read();
	fac[0]=1;
	for(ll i=1;i<N;i++)fac[i]=(1ll*fac[i-1]*i)%mod;
	for(ll i=1;i<=n+1;i++)g[i][i-1][0]=1;
	for(ll len=1;len<=n;len++){
		ll tp=n-len+1;
		for(ll l=1;l<=tp;l++){
			ll r=l+len-1;
			for(ll x=1;x<=len;x++)g[l][r][x]=g[l+1][r][x-1];
			for(ll k=l;k<=min(m[l],r-1);k++){
				for(ll x=0;x<=r-k;x++){
					g[l][r][x]=(g[l][r][x]+1ll*g[k+1][r][x]*(mod-f[l][k]))%mod;
				}
			}
			for(ll x=0;x<=len;x++)f[l][r]=(f[l][r]+1ll*g[l][r][x]*fac[x])%mod;
			if(r<=m[l])g[l][r][0]=(g[l][r][0]-f[l][r]+mod)%mod;
		}
	}
	cout<<(m[1]>=n?0:f[1][n]);
}

标签:方案,ch,OEIS,CF1874F,题解,容斥,约束,系数,区间
From: https://www.cnblogs.com/eastcloud/p/17802602.html

相关文章

  • 题解 P6560 [SBCOI2020] 时光的流逝
    题解P6560[SBCOI2020]时光的流逝首先考虑图上的点为\(y\)终点时,或者这个点无法继续向下走,即\(du_i=0\)时,从这个点为起点先手必败,而对于每一个有一条指向先手必败的点的边的点,显然从这个点出发都是先手必胜的,以此类推。可以考虑建反图,进行拓扑排序,转移状态。#include<q......
  • 题解 [ARC149B] Two LIS Sum
    题解[ARC149B]TwoLISSum大胆猜结论,按照\(a\)数组为关键字进行排序,求更改后\(b\)的\(LIS\)。证明:每次移动,都有\(a\)中增加一个长度,\(b\)中贡献可能为\(\{-1,0,1\}\),总体贡献为\(\{0,1,2\}\),具体为:\(b\)中排序后大数变到小数前方。\(b\)中排序后小数仍然......
  • CF1872E Data Structures Fan 题解
    CF1872E翻译请把数据加强到\(\sumn\leq10^8\)后重新思考。我们维护全局中被标记的所有点的异或和。发现对于一次\(1\)操作,相当于让答案异或上区间的\(a_i\)异或和,因为这会让被标记的点变成没被标记的,而没被标记的点会产生贡献。查询的话直接查询即可复杂度......
  • P2391 白雪皑皑 题解
    一种很新的区间染色题目传送门题目大意有\(n\)个数初始都为\(0\),有\(m\)次操作,第\(i\)次将\((i\timesp+q)\bmodn+1\)与\((i\timesq+p)\bmodn+1\)之间数都改为\(i\),问\(m\)次操作后每个数分别是多少。其中\(1\len\le10^6,1\lem\le1......
  • P4397聪明的燕姿 题解 & Miller~Rabin 质数判定
    涉及质数的时间复杂度都是玄学的。——题记传送门由整数唯一分解定理:\(\coprod\limits_{i=1}^{k}p_i^{c_i}\)有该正整数的正约数为:\(\coprod\limits_{i=1}^k(\sum\limits_{j=0}^{c_i}p_i^j)\)即我们要求有多少个数满足\(\coprod\limits_{i=1}^k(\sum\limits_{j=0}^{c_i}p_i^......
  • CF1707 题解
    CF1707题解A考场上1h才出思路...弱智了。我们将参加大于当前智商的行为叫做“摆烂”。我们考虑如果现在摆一次,将来某一次不摆,那么现在不摆,将来那次开摆,中间过程的智商会加1。更优。所以一定一摆就摆到底。而且一定会摆到最后一个。所以我们二分从什么时候开摆,看是否能摆到......
  • 题解:洛谷P3745 期末考试(整数三分)
    题解:洛谷P3745期末考试(整数三分)题目传送门题目大意:给出\(n\)个同学期望出成绩的时间限制\(a_i\)和\(m\)个学科公布成绩的初始时间\(t_i\),1个同学每多等一天就产生A的不愉快度。问通过一番操作后最小的不愉快度之和是多少?操作有两种:1.让学科X的发布时间晚1天,学科......
  • P5404 [CTS2019] 重复 题解
    题目链接观察题目,我们发现直接计算是困难的,先构造单个合法的\(T\)分析其性质。为了构造出\(T\),先考虑构造时\(T\)时什么时候会出现不合法的情况,此时\(T\)会有一段和\(S\)相同的前缀,且这段前缀后面跟着的字符比\(S\)所跟的小。为了避免这种情况出现,我们需要在每次添......
  • CSPRO 历届题目与题解
    官方题目链接:http://118.190.20.162/\(\Huge目录\)201609201612201709202104202109202112202203202206202209202303202305202309\(\Huge\text{CSP201609}\)火车购票问题描述请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。假设一节车厢......
  • AT_abc326_d ABC Puzzle 题解
    AT_abc326_dABCPuzzle题解看题事实上,即使在\(N=5\)的情况下,也只有\(66240\)个网格满足「每行/每列恰好包含一个A、B和C」。——官方题解其实看到这道题,就感觉是搜索,这很显然。但是我们会发现,最最最native的搜索,是\(4^{5\times5}=2^{50}\)的。感觉不大可过,但是......