AGC058D Yet Another ABC String
由于限制是循环的考虑用连续段容斥。直接容斥的做法是枚举一组限制,并带上 \((-1)^c\) 的系数:某些相邻的三个数必须 \(\in 123, 231, 312\),相交的限制会互相影响得到连续段。
直接枚举连续段,设长度为 \(i\) 的连续段系数为 \(f(i)\),连续段中最后三个数的限制必须选择,选了之后枚举下一个选的位置,可以得到递推式 \(f(i) = -(f(i-1)+f(i-2))\),归纳得 \([f(i)] = [1, 0, -1, 1, 0, -1, \dots]\)。
令 \(n = A +B + C\),直接算是 \(O(n^2)\) 的,不过可以写生成函数:$$F(x)=\frac{1}{1-\frac{a+b+c-3abc}{1-abc}}$$
将 \(1 - abc\) 移到分子上可以 \(O(n)\) 算。