反射容斥学习笔记
单直线
从 \((0,0)\) 走到 \((n,m)\) 不能碰到直线 \(y=x+b\)。
对于不合法的路径,将第一次碰到直线后面的部分沿直线翻折,变成从 \((0,0)\) 走到 \((m-b,n+b)\) 的路径。当后者必定碰到直线时构成双射,拿总路径数量减去即可
所以要特判 \(m-n>b\) 这类反射后路径不一定碰到直线,反射前路径一定碰到直线的情况。
双直线
从 \((0,0)\) 走到 \((n,m)\) 不能碰到直线 \(y=x+b\) 和 \(y=x+c\),其中 \(c\leq 0\leq b\)。
容易想到根据第一次碰到的直线分别计算。但计算方式并没有限制在碰到某直线前不能碰到另一条直线,只能通过容斥不断排除在更前面碰到另一条直线的情况。
所以我们要计算交替碰到且每次碰到都是上一次碰到另一条直线后的第一次的路径数量。
具体地,在每次碰到前,先确定最初直线在当前镜像平面的镜像直线,然后以该镜像直线为对称轴对称。因为是两条最初直线轮流对称,所以第 \(k\) 次对称的对称轴恰好为 \(y=x+c+k(b-c)\) 或 \(y=x+b-k(b-c)\)。
这里可以发现只要最初 \(c\leq m-n\leq b\) 那么后续无论反射几次路径一定都会碰到直线。
如果先对称 \(y=x+b\),那么当 \(k\) 为奇数时,终点的最终对称坐标为 \(\left(m-b-\frac{k-1}{2}(b-c),n+b+\frac{k-1}{2}(b-c)\right)\);偶数时为 \(\left(n-\frac{k}{2}(b-c),m+\frac{k}{2}(b-c)\right)\)。
如果先对称 \(y=x+c\),那么当 \(k\) 为奇数时,终点的最终对称坐标为 \(\left(m-c+\frac{k-1}{2}(b-c),n+c-\frac{k-1}{2}(b-c)\right)\);偶数时为 \(\left(n+\frac{k}{2}(b-c),m-\frac{k}{2}(b-c)\right)\)。
当 \(k\) 为奇数时,设 \(k=2t+1\),有
当 \(k\) 为偶数时,设 \(k=2t\),有
故总合法路径数量化简为
                    
                
                
            
        
浙公网安备 33010602011771号