Solution -「AGC 039F」Min Product Sum
\(\mathscr{Description}\)
Link.
对于所有 \(n\times m\) 的矩阵 \(A\), \(a_{ij}\in[1,k]\cap\mathbb N\), 求
\]
\(n,m,k\le100\), \(P\) 为素数.
\(\mathscr{Solution}\)
很有想象力的状态设计, 不愧是 AGC. (
(下令题面中 \(k\) 为 \(d\), \(k\) 另作他用.) 第一步是技巧性的转化: 把所有 "权值" 构造成方案数, 将问题变为纯纯的方案数计数问题. 这里不难将 \(A\) 的权值描述为满足 \(1\le b_{ij}\le a_{ij}\) 的矩阵 \(B\) 的数量. 我们就是要求所有 \((A,B)\) 的方案.
令 \(f(i,j,k)\) 表示考虑了所有 \(B\) 中最大值 \(\in[1,i]\) 行列以及 \(A\) 中所有最小值 \(\in[1,i]\) 的行列, 总共有 \(j\) 行被考虑到, \(k\) 列被考虑到时, 所有可确定位置的方案数之和. 注意, 对于每个位置, 当其第一次被行 (或列) 考虑到时, 我们先确定其 \(B\) 中的值; 当其接着被列 (或行) 考虑到时, 我们再确定其 \(A\) 中的值.
转移不妨先填出最小值为 \(i\) 的行, 再填出最小值为 \(i\) 的列.
填行, 对于新被考虑到的一行:
- 有 \(k\) 个位置在填 \(A\) 值. 因为本行最小值钦定为 \(i\), 所以方案数为 \((d-i+1)^k\).
- 有 \(m-k\) 个位置在填 \(B\) 值. 同理, 方案数为 \(i^{m-k}-(i-1)^{m-k}\) (容斥使得至少有一个 \(i\), 限定新行上取出 \(B\) 的行最大值为 \(i\)).
填列, 对于新被考虑到的一列:
- 有 \(j\) 个位置在填 \(A\) 值. 方案数为 \((d-i+1)^j-(d-i)^j\) (容斥使得至少有一个 \(i\), 限定新列上取出 \(A\) 的列最大值为 \(i\)).
- 有 \(n-j\) 个位置在填 \(B\) 值. 方案数为 \(i^{n-j}\).
两个不那么对称的容斥限定使得 "新建行列上有 [\(B\) 的最大值 \(i\) / \(A\) 的最小值 \(i\) / 二者]" 三种情况都能唯一地取出来. 那么枚举每次新建的行列数量, 可以做到 \(\mathcal O(nmk(n+m))\) 转移求解.
\(\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 = 100;
int n, m, d, P, bino[MAXN + 5][MAXN + 5], f[2][MAXN + 5][MAXN + 5];
inline int mul(const int u, const int v) { return 1ll * u * v % P; }
inline void subeq(int& u, const int v) { (u -= v) < 0 && (u += P); }
inline int sub(int u, const int v) { return (u -= v) < 0 ? u + P : u; }
inline void addeq(int& u, const int v) { (u += v) >= P && (u -= P); }
inline int add(int u, const int v) { return (u += v) < P ? u : u - P; }
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() {
bino[0][0] = 1;
rep (i, 1, MAXN) {
bino[i][0] = 1;
rep (j, 1, i) bino[i][j] = add(bino[i - 1][j - 1], bino[i - 1][j]);
}
}
int main() {
scanf("%d %d %d %d", &n, &m, &d, &P);
init();
f[0][0][0] = 1;
rep (i, 1, d) {
auto fcur = f[0], fnex = f[1];
rep (j, 0, n) rep (k, 0, m) {
if (int& cur = fcur[j][k]) {
int pw = 1, c = mul(sub(mpow(i, m - k),
mpow(i - 1, m - k)), mpow(d - i + 1, k));
rep (l, 0, n - j) {
addeq(fnex[j + l][k], mul(mul(bino[repl][l], pw), cur));
pw = mul(pw, c);
}
cur = 0;
}
}
fcur = f[1], fnex = f[0];
rep (j, 0, n) rep (k, 0, m) {
if (int& cur = fcur[j][k]) {
int pw = 1, c = mul(sub(mpow(d - i + 1, j),
mpow(d - i, j)), mpow(i, n - j));
rep (l, 0, m - k) {
addeq(fnex[j][k + l], mul(mul(bino[repl][l], pw), cur));
pw = mul(pw, c);
}
cur = 0;
}
}
}
printf("%d\n", f[0][n][m]);
return 0;
}
Solution -「AGC 039F」Min Product Sum的更多相关文章
- Solution -「AGC 010C」「AT 2304」Cleaning
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的无根树,点有点权,每次选择两个不同的叶子,使它们间的简单路径的所有点权 \(-1\),问能否将所有点 ...
- Solution -「AGC 019F」「AT 2705」Yes or No
\(\mathcal{Description}\) Link. 有 \(n+m\) 个问题,其中 \(n\) 个答案为 yes,\(m\) 个答案为 no.每次你需要回答一个问题,然后得知这个 ...
- Solution -「AGC 034C」Tests
\(\mathcal{Description}\) Link. 给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\ ...
- 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 019E」「AT 2704」Shuffle and Swap
\(\mathcal{Description}\) Link. 给定 \(01\) 序列 \(\{A_n\}\) 和 \(\{B_n\}\),其中 \(1\) 的个数均为 \(k\).记 \( ...
- Solution -「AGC 013E」「AT 2371」Placing Squares
\(\mathcal{Description}\) Link. 给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\ ...
随机推荐
- Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)
前言 一个排阻接八个 LED,方便又省事,但出现了P1端口输出低电平后,仿真引脚却一直显示红色保持高电平不变,用电压表测量显示 2V 左右. 这是仿真的问题,在用开发板时是不会遇到的,为了仿真的显示效 ...
- Goland编译/运行
例子程序: 3种编译方式 方式1:直接Run 编译/运行成功,且自动创建一个文件类型的编译规则. 上图中配置说明: 1.Name:为本条配置信息的名称,可以自定义,也可以使用系统默认的值 2.Run ...
- CSP-S模拟赛20241004
A 你考虑 可以把这个数组当中的每个数表示成另一种形式:\(a_i = k_i\times x+b\)(其中\(x\)是模数,\(b\)为余数). 对于求两个数是否对于某个余数同余,显然你要判断他们两 ...
- 7、listener监听
启动远程图形界面登录的工具 [root@db11g ~]# vncserver 监听 监听的启动 [oracle@db11g ~]$ lsnrctl start 判断监听是否启动 [oracle@db ...
- javaScript 的面向对象程序
理解对象 属性类型 数据属性(数据属性包含一个数据值的位置,这个位置可以读取和写入值,数据属性有4描述) [Configurable]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属 ...
- [python] asyncio库常见问题与实践案例
本文详细介绍了在使用asyncio库编写异步程序时常见的错误和问题,并进一步通过实践案例进行分析和讨论,以便在项目中更有效地应用asyncio库.有关asyncio库的详细介绍,可参考:Python ...
- 解密Facebook产品的开发流程
作者: 王淮 来源: <程序员> 发布时间: 2013-03-25 17:22 阅读: 3750 次 推荐: 6 原文链接 [收藏] [编者注]王淮是Facebook第 ...
- laravel之验证器
开发中使用框架自带验证器进行参数验证 1.定义验证器基类,定义失败返回值 新建基础类文件 app > Http > Requests > BaseRequest.php <?p ...
- git之常见问题
1. You are in the middle of a merge -- cannot amend 场景:上一次提交,本次提交与上次修改点是同一个, 覆盖是的提交,产生的错误 解决方案: git ...
- 基于Github gist的代码片段管理工具Lepton
Lepton主要功能 无限制的公共/私人片段 无限制的标签 语言组 Markdown支持 Jupyter Notebook查看器支持 macOS / Win / Linux客户端 GitHub Ent ...