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

CCPC郑州站 笨蛋题 II

yr说他们队这题A了就Au了,可惜

离散数学太无聊了,课上想的。xd半节课就切了,我想了两节课才会,做法好像不太一样。

我做计数推式子的时候总是不太流畅,感觉还是不太专注导致的。

Sol

考虑一个具体的前缀最大值方案 \(s = \array{a_1,a_2,...,a_{|s|}}\),要如何计算有多少个排列的前缀最大值方案是 \(s\)

对于 \(s\),特别地,我们钦定 \(a_0 = 0\)\(a_{|s|} = n\),我们现在考虑非前缀最大值的数要怎么放,我们尝试从后往前计算。

具体地,依次从后往前考虑 \(1\leq i \leq |s|\)\((a_{i-1},a_i)\) 里面的每一个数,\((a_{i-1},a_i)\) 里面的数只能够放到 \(a_i\) 后面,放在 \(a_i\) 后面也不会影响到后面的前缀最大值。

那么对于 \((a_{i-1},a_i)\) 它的贡献系数就是 :

\[\binom{n-a_{i-1}-1}{a_i-a_{i-1}-1}(a_i-a_{i-1}-1)! = \frac{(n-a_{i-1}-1)!}{(n-a_i)!} \]

那么所有 \(i\) 的系数乘起来就是关于这个方案的排列个数:

\[\frac{(n-1)!}{\Pi_{i=1}^{|s|-1}(n-a_i)} \]

现在我们计算这个方案出现的期望次数,也就是算这个方案出现的概率,我们记上面计算出的关于 \(s\) 的方案数为 \(f(s)\)

\[1-(\frac{n!-f(s)}{n!})^k = 1-(1-\frac{f(s)}{n!})^k = 1-(1-\frac{1}{\Pi_{i=0}^{|s|-1}(n-a_i)})^k \]

因为除以 \((n-1)!\) 后变成了 \(\frac{1}{n}\),前文有定义 \(a_0 = 0\),所以相当于从 \(i=0\) 开始计算了。

所以答案就是:

\[\sum_{s} 1-(1-\frac{1}{\Pi_{i=0}^{|s|-1}(n-a_i)})^k = 2^{n-1}-\sum_{s} (1-\frac{1}{\Pi_{i=0}^{|s|-1}(n-a_i)})^k \]

现在好像没什么思路了,因为式子没有可以继续化简的地方,此时的形式也不能够让我们直接处理,因为那个 \(k\) 次方,所以考虑对于后面那部分二项式展开:

\[\begin{align} \sum_{s} (1-\frac{1}{\Pi_{i=0}^{|s|-1}(n-a_i)})^k \\ = \sum_{i=0}^{k}\binom{k}{i}\sum_{s}(-\frac{1}{\Pi_{j=0}^{|s|-1}(n-a_j)})^i \\ = \sum_{i=0}^{k}\binom{k}{i}(-1)^i\sum_{s}\frac{1}{\Pi_{j=0}^{|s|-1}(n-a_j)^i} \end{align} \]

对于最后一个和式那里,容易发现这个只和 \(i\) 有关,并且对于同一个 \(i\) ,这个式子的结果容易用递推直接求出来,具体的,设 \(g(i,j)\) 表示 \(i\) 次方,当前 \(s\) 的最后一个元素是 \(j\)(前缀最大值是递增的),上述式子的值是多少,简单dp即可,下面是代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
#define db double
const ll N = 5005,mod = 998244353;
ll n,k,C[N][N],pw2[N],f[N][N],g[N][N],s[N][N],h[N]; 
ll qpow(ll a,ll p){ll res = 1;for(;p;p>>=1,a=a*a%mod) if(p&1) res = res*a%mod;return res;
}
void solve(){cin >> n >> k;pw2[0] = 1;for(int i=1;i<=n;i++) pw2[i] = pw2[i-1]*2%mod;C[0][0] = 1;for(int i=1;i<=k;i++){C[i][0] = 1;for(int j=1;j<=i;j++){C[i][j] = C[i-1][j]+C[i-1][j-1];if(C[i][j] >= mod) C[i][j] -= mod;}}for(int i=1;i<=n;i++){f[i][0] = 1;ll inv = qpow(i,mod-2);for(int j=1;j<=k;j++){f[i][j] = f[i][j-1]*inv%mod;}}for(int i=0;i<=k;i++){if(i) h[i] = g[i][0] = f[n][i];else h[i] = g[i][0] = 1;for(int j=1;j<n;j++){g[i][j] = h[i]*f[n-j][i]%mod;h[i] = (h[i]+g[i][j])%mod; }}ll ans = 0;for(int i=0;i<=k;i++){if(i&1) {ans = ans+(mod-C[k][i]*h[i]%mod);ans %= mod;}else{ans = ans+C[k][i]*h[i]%mod;ans %= mod;}}ans = pw2[n-1]-ans;ans = (ans%mod+mod)%mod;cout << ans << '\n';
}
int main(){cin.tie(0),cout.tie(0);ios::sync_with_stdio(0);int T = 1;
//	cin >> T;while(T--) solve();return 0;
}

容易发现这题本质上就是一道计算题,熟能生巧。

http://www.jsqmd.com/news/58739/

相关文章:

  • IDEA标签窗口好行显示 类注释和方法注释
  • LabVIEW用直线边缘检测实现液位测量 - 教程
  • HEK293细胞:为什么它是重组蛋白表达的黄金标准?
  • kettle从入门到精通 第111课 ETL之kettle webspoon7的docker部署详细教程
  • 树莓派Docker部署AdGuard Home
  • 人工智能发展史简述
  • 第四天敏捷冲刺
  • qy_蓝桥杯编程系列_编程17 好数
  • 读书笔记 XILINX ug1137-Zynq UltraScale+ MPSoC Software Developer Guide 软件开发者指南 Chapter1Chapter2
  • static相关
  • 74_基于深度学习的垃圾桶垃圾溢出检测体系(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • Java创建对象完整流程详解
  • PQ v.Next Beta计划与估计
  • re笔记5
  • 北京陪诊公司陪诊师排行
  • 北京陪诊公司排行:专业服务破解就医难题,三甲机构树立行业标杆
  • 【RAG安全】Pirates of the RAG: Adaptively Attacking LLMs to Leak Knowledge Bases - 指南
  • 20232319 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • 北京上门收酒茅台五粮液洋酒老酒名酒
  • 北京上门收酒茅台五粮液洋酒老酒名酒董酒习酒
  • this view is read-only (IntelliJ IDEA) - 详解
  • 构建高可靠 OpenEuler 运维体系:从虚拟化部署到 Systemd 自动化核心实践 - 教程
  • 内存管理-55-工具-page_types - Hello
  • 2025 年黑猪批发基地品牌推荐排行榜,黑金刚黑猪批发,国寿黑猪批发,杜洛克黑猪批发,沂蒙黑猪批发,太湖原种黑猪批发,三元仔猪黑猪批发,长白仔猪黑猪养殖,黑猪繁育,黑猪仔猪批发,原种黑猪批发基地推荐
  • 2025年必收藏的8款AI论文生成神器!高效写作轻松搞定
  • FWT 学习笔记
  • 补发读后感
  • 北京上门收酒的公司
  • 2025年LED显示屏经销最新推荐,室内LED显示屏,户外LED显示屏,单色LED显示屏,全彩LED显示屏选择指南!
  • 人工智能之数据分析 Pandas:第二章 Series