\(\mathscr{Description}\)

  Link.

  对于所有 \(n\times m\) 的矩阵 \(A\), \(a_{ij}\in[1,k]\cap\mathbb N\), 求

\[\sum_A\prod_{i,j}\min\left\{\min_{t=1}^m\{a_{it}\},\min_{t=1}^n\{a_{tj}\}\right\}\bmod P.
\]

  \(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的更多相关文章

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

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

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

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

  3. Solution -「AGC 034C」Tests

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\ ...

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

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

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

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

  6. Solution -「AGC 026D」Histogram Coloring

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

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

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

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

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

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

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

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

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

随机推荐

  1. IntelliJ IDEA 设置背景图片 随机快捷更换背景图片(附高清4K背景图N张)

    前言 开发过程枯燥乏味,何不为自己工作中添加点乐子呢,除了主题模板,我们可以设置IntelliJ IDEA 的背景图片,换个背景图,换个心情. IntelliJ IDEA 设置背景图片 注意: 必要的 ...

  2. 机器学习专业词汇:“Lookahead horizon” 可以翻译为“前瞻视距”或“预见范围”

    "Lookahead horizon" 可以翻译为"前瞻视距"或"预见范围". 在不同领域中,它可能具有稍微不同的含义: 在机器学习和人工智 ...

  3. Gitlab的基本操作

    Gitlab的基本操作 Gitlab添加组 添加组建组有多个项目分支,可以将开发添加到组里面进行设置权限, 不同的组就是公司不同的开发项目或者服务模块,不同的组添加不同的开发即可实现对开发设置权限的 ...

  4. CommonsCollections6(基于ysoserial)

    环境准备 JDK1.8(8u421)我以本地的JDK8版本为准.commons-collections(3.x 4.x均可这里使用3.2版本) cc3.2: <dependency> &l ...

  5. 牛客小白月赛105 (Python题解)

    牛客小白月赛105 (Python题解) 比赛链接:点击传送 A-lz的吃饭问题 代码: a, b = map(int,input().split()) c, d = map(int,input(). ...

  6. Webshell流量分析之哥斯拉Godzilla&冰蝎Behinder

    目录 哥斯拉 冰蝎 哥斯拉和冰蝎相较于菜刀蚁剑,它们的通信流量是加密的,有比较好的抗检测能力. 菜刀和蚁剑流量分析:Webshell流量分析之菜刀Chopper&蚁剑AntSword 哥斯拉 ...

  7. 想学习建个网站?WAMP Server助你在Windows上快速搭建PHP集成环境

    我想只要爬过几天网的同学都会知道PHP吧,异次元的新版本就是基于PHP的WordPress程序制造出来的,还有国内绝大部分论坛都是PHP的哦.据我所知很多同学都想要试着学习一下PHP,无奈要在Wind ...

  8. Mybatis【7】-- Mybatis如何知道增删改是否成功执行?

    代码直接放在Github仓库[https://github.com/Damaer/Mybatis-Learning/tree/master/mybatis-05-CURD ] 需要声明的是:此Myba ...

  9. CF 3000+

    CF1981F / *3000 首先有朴素的 dp:\(f_{u, i}\) 表示以 \(u\) 为根的子树已经 finish 了,经过 \(u\) 往上走的路径 MEX 为 \(i\).\(i\) ...

  10. PythonDay5Advance

    PythonDay5Advance 函数和模块 main函数要有,用户自己选择要做的功能,根据选择调用不同的函数 用户注册的信息需要使用一个文件存储,登录需要判断用户是否存在,密码是否正确 注册的时候 ...