首页 > 其他分享 >反射容斥

反射容斥

时间:2024-04-25 19:24:11浏览次数:16  
标签:反射 方案 sum 路径 容斥 直线 binom

反射容斥

一类关于格路计数的容斥手法。

考虑一种卡特兰数通项公式的组后证明。

一种卡特兰数的等价描述是从 \((0,0)\) 走到 \((n,n)\) 的路径数,每次只能走简单格路(每一维的变化量的绝对值的和为 \(1\)),不能经过 \(y=x+1\) 这条直线的路径方案数。

首先如果没有不经过直线的限制的方案数为 \(\binom{2n}{n}\),现在考虑如果不满足限制会发生什么。

对于一个经过 \(y=x+1\) 的路径,找到路径与直线的第一个交点 \(A\),将之前的路径沿着 \(y=x+1\) 翻折,那么一定走到一个路径重点为 \(T’(n-1,n+1)\) 的方案数。

注意到每一条到 \(T’(n-1,n+1)\) 的路径,一定都会经过 \(y=x+1\) 且与一条经过这条直线到 \(T(n,n)\) 的路径一一对应。

所以有公式:\(Catlan(n)=\binom{2n}{n}-\binom{2n}{n+1}\)

运用这个方法可以很好的运用到计数到达 \(T(n,m)\)(保证 \(n \ge m\)) 且不经过 \(y=x+1\) 的直线的方案数。

方案数为:\(f(n,m)=\binom{n+m}{n}-\binom{n+m}{n+1}\),证明与上面类似。

贺一张图方便理解:

image-20240330153102223

再推广一波,从 \((0,0)\) 到 \((n,m)\) 不经过直线 \(y=x+b\) 的方案数为:\(\binom{n+m}{n}-\binom{n+m}{n+b}\)。

继续思考:求从 \((0,0)\) 到 \((n,m)\) 不经过直线 \(y=x+l\) 且 \(y=x+r\) 的方案数 \((l<0<r)\)

先想:反射容斥能解决的是:可以找到路径第一次和某条直线的交点,然后翻折过去。

定义由 \(L,R\) 构成的字符串例如 \(RLR\) 表示依次先与 \(y=x+r\) 相交再和 \(y=x+l\) 相交再和 \(y=x+r\) 相交。(如果连续多次与一条直线相交只记录一次)

顺次处理字符串中的字符,然后前面的部分关于字符对应的直线翻折,假设最后起点为 \(x,y\),答案为 \(\binom{n+m}{n}-\binom{n-x+m-y}{n-x}\)。使用反射容斥可以计算的是所有包含当前串为子序列的字符串所代表的路径总数。(画图方便理解)

要求的答案为字符串为空集。

设 \(f(S)\) 表示处理 \(S\) 串得到的答案。使用容斥可得到。

\[ans=f(\varnothing)-f(L)-f(R)+f(LR)+F(RL)-F(LRL)-F(RLR)\cdots \]

证明:一个串 \(LRLRL\cdots\) (\(R\) 开头同理),空集有 \(1\) 的贡献。能成为子序列的有 \(S\) 的前缀以及 \(S\) 去掉第一位的所有前缀,那么刚好会做 \(-1\) 的贡献,第一个串的贡献是 \(-1,1,-1,1\cdots\)(第一位开始),第二个串的贡献是 \(1,-1,1\cdots\)(第二位开始),两柿相加和恰好为 \(-1\),再加上空集的贡献恰好为 \(0\)。所以只有当 \(S\) 为空集才会贡献。

化简可得:

\[ans=\sum_{k\in \mathbb{Z}}\binom{n+m}{n-k(r-l)}-\binom{n+m}{n-k(r-l)+r} \]

注意:\(k\) 可以取到所有整数,但是有值的位置只有 \(O(\dfrac{n}{r-l})\) 个。

https://uoj.ac/problem/424

题目要求统计长度为 \(n\),值域在 \([1,m]\) 且每种值至少出现一次的不同构的笛卡尔树个数。(如果有多个最大值取编号最小的)

首先 \(n>m\) 必然无解。

那么对于每个点,左儿子的取值要严格小于它,右儿子的取值小于等于它。

形式化定义向左的链长:设 \(f(rt)\) 为括号序列, \(f(rt)=(f(lson))+f(rson)\)

向左链长即为 \(f(rt)\) 的最大嵌套层数。

观察到向左链长只要小于等于 \(m\) 为笛卡尔树合法的充要条件。

必要性:如果向左链长大于了 \(m\),那么至少有 \(m+1\) 个不同的数,不合法。

充分性:考虑对每个节点分配合法的值域范围 \([1,x]\),当前节点直接取 \(x\),左儿子分配 \([1,x-1]\),右儿子分配 \([1,x]\) 即可。

注意到一个括号序列恰好对应一棵二叉树,转为对括号序列的计数。

讲左括号看成 \(1\),右括号看成 \(-1\),转化为计数从 \((0,0)\) 走到 \((2n,0)\),每次只能向右上/右下走,且不能经过 \(y=-1\) 和 \(y=m+1\) 的路径方案数。

发现这与我们介绍的双边界反射容斥不大相同。

考虑一种常见的手法,通过对坐标轴的旋转/对称/平移将已知推未知。

将坐标轴旋转 45 度,变为计数从 \((0,0)\) 走到 \((n,n)\),每次只能向左或者向上走,且不经过 \(y=x+1\) 和 \(y=x-m-1\) 的方案数。

套用公式可得:

\[ans=\sum_{k\in \mathbb{Z}}\binom{n+n}{n-k(2+m)}-\binom{n+n}{n-k(2+m)+1} \]

考拉声称可以使用多项式平移|连续点值平移做到根号,具体的带学习。(待补)

P3266 JLOI2015] 骗我呢

首先注意到每行 \(m\) 个数且互不相同,一共有 \(m+1\) 个数,那么中间只会有一个数没被用。

设 \(f_{i,j}\) 表示第 \(i\) 行不用值 \(j\) 的方案数。又因为 \(x_{i,j}<x_{i-1,j+1}\)。

\[\begin{aligned} f_{i,j}&=\sum_{k=0}^{j+1}f_{i-1,k} \\ &=f_{i-1,j+1}+\sum_{k=0}^{j}f_{i-1,k} \\ &=f_{i-1,j+1}+f_{i,j-1} \end{aligned} \]

每个点是由它右下角的点以及左侧的点转移而来,这并不符合我们的需求。

考虑将底 \(i\) 行的所有点集体向右平移 \(i\) 个为位置。那么有:

\[f_{i,j}=f_{i-1,j}+f_{i,j-1} \]

这是我们所会的,即从 \((0,0)\) 走到 \((n+m+1,n)\) 不经过 \(y=x+1\) 和 \(y=x-m-2\) 的方案数,带入柿子即可。(我知道你想要最终的柿子)

\[ans=\sum_{k\in \mathbb{Z}}\binom{n+n+m+1}{n+m+1-k(3+m)}-\binom{n+n+m+1}{n+m+1-k(3+m)+1} \]

标签:反射,方案,sum,路径,容斥,直线,binom
From: https://www.cnblogs.com/Hanghang007/p/18158387

相关文章

  • 容斥
    容斥基本形态:\[\begin{aligned}|X_1\cupX_2\cupX_3\cup\cdotsX_n|=\sum_{i}|X_i|-\sum_{i<j}|X_i\capX_j|\cdots\\+(-1)^{n-1}|X_1\capX_2\cdotsX_n|\end{aligned}\]令\(X\)为所有\(X_i\)的集合,则可以简便地写成:\[|\cup_{i=1}^{n}X_i|=\sum_{Y......
  • 容斥原理
    容斥原理:容斥原理是一种在知道所有集合之间的交,求集合之间的并的数学方法。(注:交即为两个集合之间相同的部分,记作\(|A|\cap|B|\))problem:设\(U\)中元素有\(n\)种不同的属性,而第\(i\)种属性称为\(P_i\),拥有属性\(P_i\)的元素构成集合\(S_i\),现在请求出\(U\)中有哪......
  • JTCR-正则、反射和文本格式化-24 (end)
    正则Pattern类用于定义正则表达式,Matcher类用于匹配正则表达式。Pattern没有构造器,使用工厂方法compile()创建模式(pattern)。staticPatterncompile(Stringpattern)它将字符串转换成Matcher可以使用的正则表达式。Pattern的matcher()方法创建Matcher。Matcherm......
  • Java 安全基础之 Java 反射机制和 ClassLoader 类加载机制
    目录Java反射机制反射java.lang.RuntimeClassLoader类加载机制URLClassLoaderJava反射机制Java反射(Reflection)是Java非常重要的动态特性。在运行状态中,通过Java的反射机制,我们能够判断一个对象所属的类。了解任意一个类的所有属性和方法。能够调用任意一个对象的任意方......
  • 【模板】容斥原理
    集合形式设\(S\)是一个有限集,\(A_1,A_2,\dots,A_n\)是\(S\)的\(n\)个子集,则:\(|S-\cup_{i=1}^{n}A_i|=\sum\limits_{i=0}^{n}(-1)^i\sum\limits_{1\lej_1\lej_2\le\dots\lej_i}|S\cap(\cap_{k=1}^iA_{j_k})|\)符号形式设\(S\)是一个有限集,\(a_1,a_2\dotsa_......
  • 容斥原理初步
    容斥原理1.容斥原理容斥原理用来解决求解\(|\bigcup_{i=1}^{n}A_i|\)的问题.具体的,定义\(U=\{i|i\in\mathbb{Z},i\in[1,n]\}\),我们有公式:\[|\bigcup_{i=1}^{n}A_i|=\sum_{S\inU}(-1)^{|S|+1}|\bigcap_{i\inS}A_i|\]由公式形式也不难观察到容斥原理可以化并为交.2.......
  • C#反射使用
    usingSystem.Reflection;namespaceTestReflection{internalclassProgram{staticvoidMain(string[]args){Console.WriteLine("TestReflection");Console.WriteLine("************************......
  • C#反射使用
    usingSystem.Reflection;namespaceTestReflection{internalclassProgram{staticvoidMain(string[]args){Console.WriteLine("TestReflection");Console.WriteLine("************************......
  • 34-Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
    需求:在开发过程中,经常会遇到的一个问题是,需要判断某个字符串是不是对象的某个成员属性名,然后根据判断结果去操作这个成员属性参考教程:Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别_javadeclaredfields-CSDN博客 可以通过以下方法:getFields(): 获......
  • java代码审计跨站脚本(XSS)--反射型
    一、基础:跨站脚本(Xss)一、原理:恶意攻击者往web页面里插入恶意js代码,而在服务端没有对数据进行严格的过滤。当用户浏览页面时,js代码必须在该html页面中(hrml必须要存在这个而已艾玛),从而达到攻击用户的目的。(攻击者构造的的js代码会被当作正常的HTML、JS代码被解析,执行Js脚本实现攻......