\[\mathfrak{Defining~\LaTeX~macros\dots}
\newcommand{\chr}[1]{\underline{\texttt{#1}}}
\]

\(\mathscr{Description}\)

  Link.

  给定 \(a,b,c\) 求由 \(a\) 个 \(\chr A\), \(b\) 个 \(\chr B\), \(c\) 个 \(\chr C\) 组成的, 不存在子串 \(\chr{ABC},\chr{BCA},\chr{CAB}\) 的字符串数量. 答案模 \(998244353\).

  \(a,b,c\le10^6\).

\(\mathscr{Solution}\)

  不合法单元 \(\chr{ABC},\chr{BCA},\chr{CAB}\) 之间可能重叠, 所以我们难以使用平凡的容斥消除合法限制. 引入更广义的容斥? 考虑计算长度为 \(k\) 的一种不合法单元循环串 \(L_k=(\chr{ABC})^{+\infty}[:k]\) 的容斥系数 \(c_k\). 本质上, 这一字符串在容斥过程中由连续的钦定不合法单元拼接而成. 因此当 \(L_k\to L_{k+1}\) 时, 为了使 \(L_{k+1,k+1}\) 被钦定入 \(L_{k+1}\), 必须钦定 \(L_{k+1}[k-1:]\) 不合法. 也就是说, \(k-1\) 必然被钦定为非法单元左端点. 而再前面一个左端点就能取 \(k-2\) 或 \(k-3\), 对应 \(L_k\) 或 \(L_{k-1}\) 的情景. 因此有 \(c_{k+1}=-(c_k+c_{k-1})\), 边界为 \(c_1=1,c_2=0\). 当然, 这也就说明 \(c_k=[k\equiv1\pmod3]-[k\equiv0\pmod3]\).

  接下来容斥 DP. 令 \(f(i,j)\) 表示完成了对 \([1,i]\) 的容斥, 有 \(j\) 个字符未被非法单元确定的方案数. 则

\[f(i,j)=f(i-1,j-1)+\sum_{k=1}^i[k\equiv1\pmod3]f(i-k,j-1)-3[k\equiv0\pmod 3]f(i-k,j).
\]

注意两个带容斥系数项的处理. 非法单元循环实际上有 \((\chr{ABC})^{\infty},(\chr{BCA})^{+\infty},(\chr{CAB})^{+\infty}\), 当 \(k\bmod3=1\) 时, 需要确定第一个, 但 \(\chr A,\chr B,\chr C\) 的消耗量不一样, 所以需要计入 \(j\); 当 \(k\bmod3=0\) 时, 直接算上三种方案就行.

  先来表示出答案,

\[\textit{ans}=\sum_i\binom{n-3i}{a-i,b-i,c-i}f(n,n-3i).
\]

组合数统一确定了 \(f\) 中的未被确定字符. 可见, 我们需要求 \(f(n,\star)\).

  需要优化, 不过后面的过程都很初等了. 引入 \(F(x,y)=\sum_{i,j}f(i,j)x^iy^j\), 那么

\[F(x,y)-1=\left(xy+\sum_{k\equiv1\pmod 3,k\ge3}x^ky-3\sum_{k\equiv0\pmod 3,k\ge1}x^k\right)F(x,y).
\]

令转移系数整体为 \(T(x,y)\), 化简得

\[T(x,y)=\frac{xy-3x^3}{1-x^3}.
\]

代回解得

\[F(x,y)=\frac{1}{1-T(x,y)}=\frac{1-x^3}{1-xy+2x^3}.
\]

提取单项系数容易做到 \(\mathcal O(1)\). 那么本题就 \(\mathcal O(n)\) 完成了.

\(\mathscr{Code}\)

/*+Rainybunny+*/

#include <bits/stdc++.h>

#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i) const int MAXN = 3e6, MOD = 998244353;
int n, a, b, c, fac[MAXN + 5], ifac[MAXN + 5], pwr[MAXN + 5]; inline int mul(const int u, const int v) { return 1ll * u * v % MOD; }
inline void subeq(int& u, const int v) { (u -= v) < 0 && (u += MOD); }
inline int sub(int u, const int v) { return (u -= v) < 0 ? u + MOD : u; }
inline void addeq(int& u, const int v) { (u += v) >= MOD && (u -= MOD); }
inline int add(int u, const int v) { return (u += v) < MOD ? u : u - MOD; }
inline int mpow(int u, int v) {
int ret = 1;
for (; v; u = mul(u, u), v >>= 1) ret = mul(ret, v & 1 ? u : 1);
return ret;
} inline void init() {
fac[0] = pwr[0] = 1;
rep (i, 1, n) fac[i] = mul(i, fac[i - 1]), pwr[i] = mul(2, pwr[i - 1]);
ifac[n] = mpow(fac[n], MOD - 2);
per (i, n - 1, 0) ifac[i] = mul(i + 1, ifac[i + 1]);
} inline int bino(const int u, const int v) {
return u < v ? 0 : mul(fac[u], mul(ifac[v], ifac[u - v]));
} /** Calculate [x^uy^v](1-xy+2x^3)^{-1}. */
inline int calc(const int u, const int v) {
if ((u + 2 * v) % 3) return 0;
int k = (u + 2 * v) / 3;
if (k < v) return 0;
return mul(bino(k, v), (k - v & 1 ? sub : add)(0, pwr[k - v]));
} int main() {
scanf("%d %d %d", &a, &b, &c);
n = a + b + c, init(); int ans = 0;
rep (i, 0, std::min({ a, b, c })) {
addeq(ans, mul(mul(fac[n - 3 * i], mul(ifac[a - i],
mul(ifac[b - i], ifac[c - i]))),
sub(calc(n, n - 3 * i), calc(n - 3, n - 3 * i))));
}
printf("%d\n", ans);
return 0;
}

Solution -「AGC 058D」Yet Another ABC String的更多相关文章

  1. Solution -「AGC 036D」「AT 5147」Negative Cycle

    \(\mathcal{Descriprtion}\)   Link.   在一个含 \(n\) 个结点的有向图中,存在边 \(\lang i,i+1,0\rang\),它们不能被删除:还有边 \(\l ...

  2. Solution -「AGC 016F」Games on DAG

    \(\mathcal{Description}\)   Link.   给定一个含 \(n\) 个点 \(m\) 条边的 DAG,有两枚初始在 1 号点和 2 号点的棋子.两人博弈,轮流移动其中一枚棋 ...

  3. Solution -「AGC 026D」Histogram Coloring

    \(\mathcal{Description}\)   Link.   有 \(n\) 列下底对齐的方格纸排成一行,第 \(i\) 列有 \(h_i\) 个方格.将每个方格染成黑色或白色,求使得任意完 ...

  4. Solution -「AGC 004E」「AT 2045」Salvage Robots

    \(\mathcal{Description}\)   Link.   有一个 \(n\times m\) 的网格.每个格子要么是空的,要么有一个机器人,要么是一个出口(仅有一个).每次可以命令所有机 ...

  5. Solution -「AGC 012F」「AT 2366」Prefix Median

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_{2n-1}\}\),将 \(\{a_{2n-1}\}\) 按任意顺序排列后,令序列 \(b_i\) 为前 ...

  6. Solution -「AGC 010C」「AT 2304」Cleaning

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的无根树,点有点权,每次选择两个不同的叶子,使它们间的简单路径的所有点权 \(-1\),问能否将所有点 ...

  7. Solution -「AGC 019E」「AT 2704」Shuffle and Swap

    \(\mathcal{Description}\)   Link.   给定 \(01\) 序列 \(\{A_n\}\) 和 \(\{B_n\}\),其中 \(1\) 的个数均为 \(k\).记 \( ...

  8. Solution -「AGC 019F」「AT 2705」Yes or No

    \(\mathcal{Description}\)   Link.   有 \(n+m\) 个问题,其中 \(n\) 个答案为 yes,\(m\) 个答案为 no.每次你需要回答一个问题,然后得知这个 ...

  9. Solution -「AGC 013E」「AT 2371」Placing Squares

    \(\mathcal{Description}\)   Link.   给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\ ...

  10. Solution -「AGC 003D」「AT 2004」Anticube

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个数 \(a_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数.   \(n\le10^5\) ...

随机推荐

  1. C语言模拟算法

    文章目录 1.数据结构 1.1基于数组 1.2 基于字符串 1.3基于链表 1.4基于矩阵 2.算法技巧 2.1.排序 2.2.递归 2.3.迭代 3.实战 3.1 力扣面试题16.01 交换数字 3 ...

  2. Nuxt.js 应用中的 imports:sources 事件钩子详解

    title: Nuxt.js 应用中的 imports:sources 事件钩子详解 date: 2024/10/27 updated: 2024/10/27 author: cmdragon exc ...

  3. 初识GO语言--函数

  4. 鸿蒙Banner图一多适配不同屏幕

    认识一多 随着终端设备形态日益多样化,分布式技术逐渐打破单一硬件边界,一个应用或服务,可以在不同的硬件设备之间随意调用.互助共享,让用户享受无缝的全场景体验.而作为应用开发者,广泛的设备类型也能为应用 ...

  5. 多校A层冲刺NOIP2024模拟赛20

    多校A层冲刺NOIP2024模拟赛20 昨天晚上打 ABC 了,所以今天才发. T1 星际联邦 直接上 菠萝(Borůvka)算法就行了,当然还可以用线段树优化 prim算法,但是没打过只是口胡:就是 ...

  6. SAM4MLLM:结合多模态大型语言模型和SAM实现高精度引用表达分割 | ECCV'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expres ...

  7. 太强了!14.7K star!Windows系统居然还有开源替代版了?!

    在操作系统的世界里,Windows 系统一直占据着重要的地位.然而,你可能不知道的是,还有一个拥有 14.7K star 的开源替代版 --ReactOS. 1.ReactOS 介绍 ReactOS ...

  8. zkw 线段树-原理及其扩展

    前言 许多算法的本质是统计.线段树用于统计,是沟通原数组与前缀和的桥梁. <统计的力量>清华大学-张昆玮 关于线段树 前置知识:线段树 OIWiki. 线段树是一种专门维护区间问题的数据结 ...

  9. 2023NOIP A层联测16 T3 货物运输

    2023NOIP A层联测16 T3 货物运输 题目描述说这是一个仙人掌图,通常将问题转换为环和树的问题在使用圆方树来解决. 树解法 令 \(a_i=s_i-\frac{\sum s_i}{n}\) ...

  10. Selenium IDE使用指南一(爬虫脚本录制器)

    安装 从Chrome或Firefox网络商店安装Selenium IDE . 启动IDE 安装后,通过从浏览器菜单栏中单击其图标来启动它. 故障排除 在菜单栏中没有看到Selenium IDE的图标? ...