当前位置: 首页 > news >正文

反射容斥与镜像法

反射容斥与镜像法

(By G2029 谭家齐)

反射容斥

单线容斥

  • 在二维平面直角坐标系中,从 \((0,0)\) 走到 \((n,m)\) ,每次只能往右走一格或者往上走一格,问方案数。

  • 若走的时候不能越过 \(y=x+b\) 这条直线,方案数又有多少种?

第一个题目的答案应该是$\displaystyle\binom{n+m}{n} $ ,非常简单。

第二个题目其实也比较简单:

我们考虑将终点 \((n,m)\) 关于 \(y=x+b\) 这条直线对称,得到一个新的点 \((m-b,n+b)\) 。(具体推导可以自行完成)

可以发现对于一个原来非法的情况,一定只存在且只存在一个到达 \((m-b,n+b)\) 的路径,使得这两个路径同构(即两个路径只是关于 \(y=x+b\) 这条直线翻了一次)。

那么现在就好做了,答案应该为 \(\displaystyle\binom{n+m}{n} - \binom{n+m}{n+b}\)

考虑特殊情况 \(n=m\)\(b=0\) 显然上面的答案为卡特兰数。

双线容斥

这才是重点。

还是一个例题来举例。

  • 在二维平面直角坐标系中,从 \((0,0)\) 走到 \((n,m)\) ,每次只能往右走一格或者往上走一格,全程中不能触碰到 \(y=x+b\)\(y=x+c\) 两条直线,且保证 \(c\leq b\),问方案数。

仍考虑容斥。

一个一般的考虑是用所有的方案减去触碰 \(y=x+b\) 的,减去触碰 \(y=x+c\) 的,再加上同时触碰 \(y=x+b\)\(y=x+c\) 的方案数。

但是很明显,两条线可以来回碰,我们并不能很好的计算出上面的答案。(或者说,你并不能保证在碰到一条线前没有碰到另一条线)。

给出一些符号定义(方便表示):

\(f(str)\) 表示钦定先后碰了 \(str\) 这些线的方案数,其中 \(\forall i\in[1,size],str_i\in\{b,c\}\)

那么答案应为 \(f(\emptyset)-f(b)-f(c)+f(bc)+f(cb)-f(bcb)\dots\) 我们要做的就是不断将路径进行对称。如 \(f(b)\) 的方案数就是将路径关于 \(y=x+b\) 对称。而 \(f(bc)\) 就应该是先将路径关于 \(y=x+b\) 对称,再关于 \(y=x+c\) 关于 \(y=x+b\) 的对称线对称。(这句话有点绕,稍微理解一下。。。)

理论上这样就能做了。对它稍微优化一下因为每一次的对称都会偏移 \(b-c\) ,所以时间复杂度应该是 \(\displaystyle O(\frac{n+m}{b-c})\) 的。

但是这样还是太吃操作了。

我们有更好用的做法。


引理

将一个点 \((x,y)\) 依次关于 \(y=x+a_1,y=x+a_2,y=x+a_3 \dots y=x+a_k\) 对称,设 \(S=\sum(-1)^{i-1}a_i\),则当 \(k\) 为奇数的时候变换后的点为 \((y-S,x+S)\),反之为 \((x+S,y-S)\)

归纳证明即可。


那么现在对于一个已知的 \(str\) ,我们来分类讨论一下。

  • 若我们先对称 \(y=x+b\)
    • \(k\) 为奇数的时候,第 \(k\) 次对称时候的 \(S = b+\frac{k-1}{2}(b-c)\)
    • \(k\) 为偶数的时候,第 \(k\) 次对称时候的 \(S=\frac{k}{2}(b-c)\)
  • 若我们先对称 \(y=x+c\)
    • \(k\) 为奇数的时候,第 \(k\) 次对称时候的 \(S=c-\frac{k-1}{2}(b-c)\)
    • \(k\) 为偶数的时候,第 \(k\) 次对称时候的 \(S=-\frac{k}{2}(b-c)\)

那么我们可以用上面的引理来快速得到对称的点了。

对于原来的 \((n,m)\) 现在我们可以分类讨论得到:

  • 若我们先对称 \(y=x+b\)
    • \(k\) 为奇数的时候,第 \(k\) 次对称后的点 \((m-b-\frac{k-1}{2}(b-c),n+b+\frac{k-1}{2}(b-c))\)
    • \(k\) 为偶数的时候,第 \(k\) 次对称后的点 \((n-\frac{k-1}{2}(b-c),m+\frac{k-1}{2}(b-c))\)
  • 若我们先对称 \(y=x+c\)
    • \(k\) 为奇数的时候,第 \(k\) 次对称后的点 \((m-c+\frac{k-1}{2}(b-c),n+c-\frac{k-1}{2}(b-c))\)
    • \(k\) 为偶数的时候,第 \(k\) 次对称后的点 \((n+\frac{k-1}{2}(b-c),m-\frac{k-1}{2}(b-c))\)

现在考虑答案 \(\displaystyle answer=\binom{n+m}{n}-\sum_{k>0}(-1)^k\sum_{|str|=k}f(str)\)

那么:

  • 对于 \(k=2r+1\) ,其中 \(r\in \mathbb{Z}\)

\[\begin{aligned}\sum_{r\ge 0}\binom{n+m}{n+b+r(b+c)}+\binom{n+m}{n+c-r(b-c)} &=\sum_{r\ge 0}\binom{n+m}{n+b+r(b-c)}+\sum_{r\leq -1}\binom{n+m}{n+b+r(b-c)}\\ &=\sum_{r\in \mathbb{Z}} \binom{n+m}{n+b+r(b-c)} \end{aligned}\]

  • 对于 \(k=2r\),其中 \(r\in \mathbb{Z}\)

\[\begin{aligned}\sum_{r\ge1} \binom{n+m}{n-r(b-c)}+\binom{n+m}{n+r(b-c)} =\sum_{r\in\mathbb{Z}}\binom{n+m}{n-r(b-c)}-\binom{n+m}{n} \end{aligned}\]

两式相减得到:

\[\begin{align*} answer=\sum_{r\in \mathbb{Z}}\binom{n+m}{n+r(b-c)}-\binom{n+m}{n+b+r(b-c)} \end{align*}\]

然后时间复杂度为 \(\displaystyle O(\frac{n+m}{b-c})\)

http://www.jsqmd.com/news/678233/

相关文章:

  • 告别调参玄学:用C++手搓一个MPC控制器,聊聊Q、R、F矩阵到底怎么调
  • 别再写一堆if了!Pandas多条件筛选的3种高效写法(附避坑指南)
  • Excel规划求解加载项:从安装到实战,用它解多元方程组比你想的更简单
  • 深入TI C6747 DSP的EMIF接口:异步存储器访问时序分析与FPGA侧设计要点
  • GDN融合门控注意力的动态资源分配机制,AI智能体调动实战演练
  • 2026数据中台选型:从“平台建设”到“智能治理”,谁能打通数据价值最后一公里?
  • 3步告别求职陷阱:智能时间标注插件让过时岗位无处藏身
  • 2026年攀枝花老陈装饰:攀枝花装修公司,旧房装修公司,旧房翻新公司,工厂装修公司,别墅装修公司选择指南 - 海棠依旧大
  • 同步爬虫太慢了!aiohttp+asyncio异步实战:单机并发直接提升100倍
  • 别再瞎买显卡了!用PyTorch的thop库,5分钟算出你的模型到底需要多少显存和算力
  • 三分钟解决Windows热键冲突的终极侦探工具
  • 抖音直播间数据抓取完整指南:2025最新WebSocket协议逆向工程实战
  • 手机号查QQ号:你的智能助手如何帮你省心省力
  • 农产品价格行情数据接口API介绍
  • 新手工程师必看:搞定EMI传导干扰,从理解差模和共模开始(附实战案例)
  • MCNP新手避坑指南:手把手教你写对第一个SDEF源卡(附137铯源完整示例)
  • 智能数据标注实战指南:10倍效率提升的自动化解决方案
  • 保姆级教程:用Superset+MySQL搞定Kaggle牛油果销售数据可视化(附完整数据集)
  • 告别混乱标注!用Python脚本一键清理Labelme JSON文件中的多余标签编号
  • 几何光学仿真终极指南:5步快速掌握光学系统设计
  • Prism方差分析结果看不懂?手把手教你解读F值、P值与方差分析表
  • 2026年电动工业提升门定做厂家实力排行一览:成都防火卷帘门工厂,抗风卷帘门,欧式卷帘门定制厂家,排行一览! - 优质品牌商家
  • M62429L驱动实战:从时序解析到嵌入式C代码实现
  • 别再只用梯度下降了:ISTA算法如何解决病态方程与特征选择难题?
  • xrdp深度解析:构建高性能Linux远程桌面服务器的技术实现与优化指南
  • PCB设计时序不求人:手把手教你用Allegro动态延迟(Dly)功能搞定50mm±0.5mm精确等长
  • FPGA与ASIC设计优化及移植策略详解
  • 六角螺栓有哪些类型?性能等级、应用场景与采购选型解析|2026上海紧固件专业展
  • 别再让符号定时偏差搞砸你的OFDM仿真!手把手教你用MATLAB实现STO估计(附完整代码)
  • Linux学习