\(\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. nginx从入门到实战

    概述 异步非阻塞的高性能HTTP和反向代理服务器 nginx的运行架构 1.Master进程 启动检查nginx.conf是否正确 根据配置文件创建.监控worker进程的数量和状态 监听socket ...

  2. spring boot下跨域安全配置

    1 @Bean 2 public FilterRegistrationBean corsFilter() { 3 final UrlBasedCorsConfigurationSource sourc ...

  3. 题解: CF768D Jon and Orbs

    题解:CF768D Jon and Orbs 一句话题面:有k种不同的物品,每天等概率任取一种(不一定是新的种类).q组询问,每组给出一个p,问取完这k件物品的概率不小于\(\frac{p}{2000 ...

  4. 如何用 Spring AI + Ollama 构建生成式 AI 应用

    为了构建生成式AI应用,需要完成两个部分: AI大模型服务:有两种方式实现,可以使用大厂的API,也可以自己部署,本文将采用ollama来构建 应用构建:调用AI大模型的能力实现业务逻辑,本文将采用S ...

  5. StarRocks 物化视图刷新流程及原理

    前段时间给 StarRocks 的物化视图新增了一个特性,那也是我第一次接触 StarRocks,因为完全不熟悉这个数据库,所以很多东西都是从头开始了解概念. 为了能顺利的新增这个特性(具体内容可以见 ...

  6. shell最简单的办法实现进度条

    一直很好奇shell命令行安装脚本的时候怎么实现自动增长进度条而且不增加新输出的问题.以前一直觉得是不断print出来东西,但是已经输出到命令行终端的为什么也能被覆盖呢,于是看到别人写的进度条,不断尝 ...

  7. 原生鸿蒙中的RN日志系统

    一.创作背景 在上一篇博客中,我分享了在原生鸿蒙中,进行RN的热加载,以达到修改RN代码后不需要重新打包,即可实时调试的效果. 本次我将分享一下RN的日志系统,以及对js中线上bug的监听,希望能对大 ...

  8. 数据抽取平台pydatax使用案例---11个库项目使用

    数据抽取平台pydatax,前期项目做过介绍: 1,数据抽取平台pydatax介绍--实现和项目使用 项目2: 客户有9个分公司,用的ERP有9套,有9个库,不同版本,抽取的同一个表字段长度有不一样, ...

  9. vue在组件中实现双向绑定

    父组件中的一个变量和子组件的input框实现双向绑定,就要用到下面的方法: 父组件: <script> import CustomInput from './CustomInput.vue ...

  10. PHP扩展之Yaconf

    这个是继鸟哥出品的yaf,yar 之后的又一个好用的工具.  Yaconf配置管理工具 具体可以看鸟哥的文档: https://www.laruence.com/2015/06/12/3051.htm ...