当前位置: 首页 > news >正文

P10005 [集训队互测 2023] 基础寄术练习题 题解

\(\text{P10005 [集训队互测 2023] 基础寄术练习题 题解}\)

有点人类智慧了说实在的。

先考虑看上去较为简单的 \(k=1\),要求的就是序列前缀和的积的倒数。直接想去拆开来是不好做的,没有常见的等式形式满足这个东西,于是考虑组合意义。前缀和的积这个形式太难搞了,能否用一个模型转化掉?这个前缀和之积的形式很像树上拓扑序的式子:每次钦定根节点在首位,概率就是 \(\frac 1{siz}\),并且概率也能不断向下迭代构成 \(\frac{1}{\prod siz_i}\) 的形式,因为去掉根的限制后都是互不相关的。那么将这个意义转化到序列上:相当于是有一个序列,值为 \(i\) 的元素有 \(a_i\) 个,要求元素 \(i\) 最后一次出现位置小于元素 \(i+1\) 最后一次出现位置。这个东西的概率从后往前考虑最后一次的取值显然是 \(\prod\frac{a_i}{s_i}\)。由于每种序列事实上与每种 \(a_i\) 是唯一对应的,这个东西就是考虑序列每种元素实际上的最终取值位置记录在 \(a\) 中,因此有 \(\sum_a\prod\frac{a_i}{s_i}=1\)。这样一来 \(\sum\prod\frac 1{s_i}=\sum\prod\frac 1{a_i}\),那么设计 dp 求出在值域 \([1,m]\),选出 \(n\) 个元素,对于元素 \(i\) 权值是 \(\frac 1i\) 的权值之和即可,这是背包 dp 的板子题。

对于 \(k=2\),依然沿用之前的方法,看上去给每个答案 \(\times a_1\) 即可,但是不要忽略此时 \(a_1\) 最后的出现位置要最小的限制。我们计算排列合法的概率,直接处理这个限制是困难的,考虑容斥,钦定集合 \(B\) 内的元素最后一次出现位置是小于 \(a_1\) 的,那么我们依次插入元素,对应的方案数就是:

\[\frac{S_B}{\prod b_i}{{S_B+a_1-1}\choose S_B}{\frac{(\sum a)!}{(S_B+A_1)!\prod c_i!}} \]

其中 \(b_i\)\(B\) 内元素在序列中个数,\(c_i\) 是非 \(B\) 内元素且非 \(a_1\) 元素在序列中个数,\(S_B=\sum b_i\)

然后求概率就除以 \(\frac{(\sum a)!}{\prod a_i}\),贡献就是 \(\frac{a_1}{S_B+a_1}\),乘上容斥系数 \((-1)^B\) 即可。这个东西是容易设计 dp 的:设 \(dp_{i,j,s,0/1}\) 表示前 \(i\) 个数中选了 \(j\) 个元素在 \(a\) 中,\(S_B+a_1=s\),有没有钦定 \(a_1\) 时的系数,然后就做完了。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 105, M = 1e4 + 5;
int n, m, k, p;
int inv[M];
inline void add(int &x, int y) {x = x + y >= p ? x + y - p : x + y;
}
namespace s1 {int dp[N];int main() {dp[0] = 1;for (int i = 1; i <= m; i++)for (int j = n; j; --j)add(dp[j], 1ll * dp[j - 1] * inv[i] % p);cout << dp[n] << '\n';return 0;}
}
namespace s2 {int dp[2][N][M][2];int main() {int u = 0;dp[0][0][0][0] = 1;for (int i = 1; i <= m; i++) {u ^= 1;for (int j = 0; j < N; j++)for (int t = 0; t < M; t++)dp[u][j][t][0] = dp[u][j][t][1] = 0;for (int j = 0; j < n; j++)for (int s = 0; s < M; s++)for (int r = 0; r < 2; r++) {int w = dp[u ^ 1][j][s][r];if (!w) continue;add(dp[u][j][s][r], w);add(dp[u][j + 1][s][r], 1ll * inv[i] * w % p);add(dp[u][j + 1][s + i][r], 1ll * (p - inv[i]) * w % p);if (!r) add(dp[u][j][s + i][1], 1ll * i * w % p);}}int ans = 0;for (int s = 0; s < M; s++) add(ans, 1ll * dp[u][n - 1][s][1] * inv[s] % p);cout << ans << '\n';return 0;}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m >> k >> p;inv[1] = 1;for (int i = 2; i < M; i++) inv[i] = 1ll * (p - p / i) * inv[p % i] % p;if (k == 1) return s1::main();return s2::main();
}
http://www.jsqmd.com/news/149707/

相关文章:

  • ChatGLM-TensorFlow适配进展与挑战
  • 澜舟科技孟子模型TensorFlow部署方案
  • 小白也能秒懂:JavaScript 解构赋值的“外挂”人生
  • BeMusic3.1.3音乐网站源码开心版自带中文+搭建教程
  • 基于主从博弈的智能小区电动汽车充电管理与定价策略探索
  • Arduino Nano 33 BLE Sense部署TensorFlow Lite模型
  • 异构计算调度:TensorFlow对CPU/GPU/TPU统一抽象
  • 深度洞察:2025中国家纺十大品牌行业观察与标杆企业巡礼 - 速递信息
  • 探索MATLAB下考虑V2G的光储充一体化微网多目标优化调度策略
  • Apple Silicon M系列芯片上的TensorFlow性能表现
  • TensorFlow与Spark集成:大规模特征处理新范式
  • TensorFlow Hub最新预训练模型排行榜TOP20
  • DSP28035充电桩 量产充电桩 采用DSP28035作为主控 全数字电源设计
  • 昆仑芯PaddlePaddle模型转TensorFlow可行性探讨
  • 基于单片机体温心率脉搏检测仪系统设计
  • 【单片机毕设】151.1基于单片机stm32物联网智能宠物屋控制毕业设计项目
  • 如何整合API测试到自动化流程?
  • WebGL加速TensorFlow.js推理性能实测
  • OpenVINO调用TensorFlow模型性能评测
  • FPGA加速TensorFlow推理:Xilinx Alveo实测
  • XLA编译器优化:提升TensorFlow执行效率的关键
  • 信创环境下TensorFlow兼容性问题及解决方法
  • 构建专属AI芯片编译器:对接TensorFlow Frontend
  • 亲身经历:我用这9款AI工具半天搞定毕业论文,文理医工全覆盖
  • linux开发——tftp配置与使用
  • 2025最新!8个AI论文软件测评:研究生开题报告必备推荐
  • 最近在研究孤岛模式下两台逆变器的下垂控制算法,发现这玩意儿还挺有意思的。今天就来聊聊这个,顺便穿插点代码和分析,希望能给大家带来点启发
  • SDET面试必刷:10道高频LeetCode算法题(附Python/Java解法)
  • Keras到TensorFlow SavedModel格式转换指南
  • 类属性与实例属性的区别