Solution -「AGC 058D」Yet Another ABC String
\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\) 个字符未被非法单元确定的方案数. 则
\]
注意两个带容斥系数项的处理. 非法单元循环实际上有 \((\chr{ABC})^{\infty},(\chr{BCA})^{+\infty},(\chr{CAB})^{+\infty}\), 当 \(k\bmod3=1\) 时, 需要确定第一个, 但 \(\chr A,\chr B,\chr C\) 的消耗量不一样, 所以需要计入 \(j\); 当 \(k\bmod3=0\) 时, 直接算上三种方案就行.
先来表示出答案,
\]
组合数统一确定了 \(f\) 中的未被确定字符. 可见, 我们需要求 \(f(n,\star)\).
需要优化, 不过后面的过程都很初等了. 引入 \(F(x,y)=\sum_{i,j}f(i,j)x^iy^j\), 那么
\]
令转移系数整体为 \(T(x,y)\), 化简得
\]
代回解得
\]
提取单项系数容易做到 \(\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的更多相关文章
- Solution -「AGC 036D」「AT 5147」Negative Cycle
\(\mathcal{Descriprtion}\) Link. 在一个含 \(n\) 个结点的有向图中,存在边 \(\lang i,i+1,0\rang\),它们不能被删除:还有边 \(\l ...
- Solution -「AGC 016F」Games on DAG
\(\mathcal{Description}\) Link. 给定一个含 \(n\) 个点 \(m\) 条边的 DAG,有两枚初始在 1 号点和 2 号点的棋子.两人博弈,轮流移动其中一枚棋 ...
- Solution -「AGC 026D」Histogram Coloring
\(\mathcal{Description}\) Link. 有 \(n\) 列下底对齐的方格纸排成一行,第 \(i\) 列有 \(h_i\) 个方格.将每个方格染成黑色或白色,求使得任意完 ...
- Solution -「AGC 004E」「AT 2045」Salvage Robots
\(\mathcal{Description}\) Link. 有一个 \(n\times m\) 的网格.每个格子要么是空的,要么有一个机器人,要么是一个出口(仅有一个).每次可以命令所有机 ...
- Solution -「AGC 012F」「AT 2366」Prefix Median
\(\mathcal{Description}\) Link. 给定序列 \(\{a_{2n-1}\}\),将 \(\{a_{2n-1}\}\) 按任意顺序排列后,令序列 \(b_i\) 为前 ...
- Solution -「AGC 010C」「AT 2304」Cleaning
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的无根树,点有点权,每次选择两个不同的叶子,使它们间的简单路径的所有点权 \(-1\),问能否将所有点 ...
- Solution -「AGC 019E」「AT 2704」Shuffle and Swap
\(\mathcal{Description}\) Link. 给定 \(01\) 序列 \(\{A_n\}\) 和 \(\{B_n\}\),其中 \(1\) 的个数均为 \(k\).记 \( ...
- Solution -「AGC 019F」「AT 2705」Yes or No
\(\mathcal{Description}\) Link. 有 \(n+m\) 个问题,其中 \(n\) 个答案为 yes,\(m\) 个答案为 no.每次你需要回答一个问题,然后得知这个 ...
- Solution -「AGC 013E」「AT 2371」Placing Squares
\(\mathcal{Description}\) Link. 给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\ ...
- Solution -「AGC 003D」「AT 2004」Anticube
\(\mathcal{Description}\) Link. 给定 \(n\) 个数 \(a_i\),要求从中选出最多的数,满足任意两个数之积都不是完全立方数. \(n\le10^5\) ...
随机推荐
- pdf.js使用
百度上很多例子,都是构建之前的! 我们使用pdf.js,最终只需要构建后的内容,大家可以通过这里进行下载: https://pan.baidu.com/s/14J-m-jeHdvn46cPhPXk54 ...
- 2025年前端面试准备js篇
1.js的基本数据类型有哪些 undefined,null,bo0lean,number,string,object,Symbol,bigInt 分为原始类型和引用类型 原始类型:undefined, ...
- flask+gunicorn+supervisor部署项目
一.安装模块 pip install gunicorn gevent # 如果使用python supervisor,需要安装模块 pip install supervisor # 建议使用yum安装 ...
- Maven多模块项目 eclipse热部署 Maven项目实现 tomcat热部署
Maven 多模块项目在eclipse下面热部署,即你可以体验下无论你修改整个项目里面的任何模块的代码,都不需要用maven打包就可以看到效果, 1.首先准备好创建一个maven多项目的代码,准备好一 ...
- Docker之磁盘清理
Docker 很占用空间,每当我们运行容器.拉取镜像.部署应用.构建自己的镜像时,我们的磁盘空间会被大量占用. 如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何 ...
- Ubuntu默认启动到字符界面
修改/etc/default/grub sudo cp /etc/default/grub /etc/default/grub.bak sudo chmod 0777 /etc/default/gru ...
- 构造SLR语法分析表
构造SLR语法分析表 方法: 1)构造G'的规范LR(0)项集族 2)根据规则生成动作 3)生成转换 4)设置报错 /** * P157 规范LR(0)项集族 * @param grammar */ ...
- Linx操作Nginx命令
在 CentOS 上操作 Nginx 包括安装.启动.停止.重新加载配置等.以下是在 CentOS 上操作 Nginx 的常用命令: 安装 Nginx: sudo yum install nginx ...
- dotnet core微服务框架Jimu ~部署和调用演示
首先运行 consul 下载 consul 以开发模式运行 consul agent -dev 2. 调试 用 Visual Studio 2022 IDE 打开项目: 右击解决方案-选择" ...
- 服务迁移之《tomcat性能优化》
删除无用的connector,因为一般的tomcat前面都会挂有nginx服务 增加connnector使用的线程池的数量 删除没有用的listener host优化项:autoDeploy设置为fa ...