news 2026/5/4 5:20:56

Hz的计数问题总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hz的计数问题总结

前言

看见 mod1e9 + 7 就跪了,遂写一篇博客把所有的计数问题、组合数学问题都记录下来…

正片

E. Girl Permutation

Some permutation of lengthn nnis guessed.

You are given the indices of its prefix maximums and suffix maximums.

Recall that a permutation of lengthk kkis an array of sizek kksuch that each integer from1 11tok kkoccurs exactly once.

Prefix maximums are the elements that are the maximum on the prefix ending at that element. More formally, the elementa i a_iaiis a prefix maximum ifa i > a j a_i > a_jai>ajfor everyj < i j < ij<i.

Similarly, suffix maximums are defined, the elementa i a_iaiis a suffix maximum ifa i > a j a_i > a_jai>ajfor everyj > i j > ij>i.

You need to output the number of different permutations that could have been guessed.

As this number can be very large, output the answer modulo1 0 9 + 7 10^9 + 7109+7.

感觉好经典的模型,没有想出来是因为一直在纠结两部分分开处理的情况下发生重复怎么办。。

实际上我们可以发现,只要先用组合数C CC选出一部分数字放在左边,剩下的部分放在右边,则两部分一定不会发生重复

但是一定存在一种方案使得它们摆放起来满足方案吗?

答案是YES,这个自己手玩一下就可以发现了,数量够的情况下,排列中的数字两两不同,则总会存在一种方式使得摆放是正确的。

因此分开考虑是合法的。

接下来就是单独考虑左边,我们从右向左(从高到低)遍历p pp数组,可以发现每两个相邻的下标中间存在着一些 gap,我们选择一些比 p[i] 和 p[i + 1] 都要小的数字填充这些 gap(全排列),所以就是comb(p[i + 1] - 2, p[i + 1] - p[i] - 1);

这里的 -2 是因为最大值和次大值已经放在了 p[i] 和 p[i + 1] 的位置,故,必须-2.

最后代码如下:

intqpow(inta,intk){a%=mod;i64 res=1%mod;while(k){if(k&1)res=(i64)res*a%mod;a=(i64)a*a%mod;k>>=1;}returnres;}intinv(intx){returnqpow(x,mod-2);}structComb{intn;vector<int>fac,invfac,pow2;Comb():n(0){}Comb(int_n):n(0){init(_n);}voidinit(intm){if(m<=n)return;fac.resize(m+1);invfac.resize(m+1);pow2.resize(m+1);pow2[0]=1;for(inti=1;i<=m;i++){pow2[i]=(int)(pow2[i-1]*2LL)%mod;}intstart=n>0?n+1:1;if(n==0){fac[0]=invfac[0]=1;}for(inti=start;i<=m;i++){fac[i]=(int)((i64)fac[i-1]*i%mod);}invfac[m]=qpow(fac[m],mod-2);for(inti=m;i>(n==0?1:n);i--){invfac[i-1]=(int)((i64)invfac[i]*i%mod);}n=m;}// fac[m]intF(intm){if(m>n)init(2*m);returnfac[m];}// invfac[m]intiF(intm){if(m>n)init(2*m);returninvfac[m];}// inv[m] = m^{-1}intinv(intm){returnqpow(m,mod-2);}// pow(2, n)intP2(intm){if(m<=n)returnpow2[m];returnqpow(2,m);}// A(n, m) = n! / (n - m)!intA(intn_,intm_){if(m_<0||m_>n_)return0;if(n_>n)init(2*n_);return(int)((i64)fac[n_]*invfac[n_-m_]%mod);}// C(n, m) = n! / (m! * (n - m)!)intC(intn_,intm_){if(m_<0||m_>n_)return0;if(n_>n)init(2*n_);return(int)((i64)fac[n_]*invfac[m_]%mod*invfac[n_-m_]%mod);}};Combcomb(1e6);voidsolve(){intn,m1,m2;cin>>n>>m1>>m2;vector<int>p(m1+1),s(m2+1);for(inti=1;i<=m1;i++){cin>>p[i];}for(inti=1;i<=m2;i++){cin>>s[i];}if(s[m2]!=n||p[1]!=1||s[1]!=p[m1]){cout<<0<<endl;return;}intans=comb.C(n-1,p.back()-1);for(inti=m1-1;i>=1;i--){intg=p[i+1]-p[i]-1;(ans*=comb.C(p[i+1]-2,g)*comb.F(g)%mod)%=mod;}for(inti=1;i<=m2-1;i++){intg=s[i+1]-s[i]-1;(ans*=comb.C(n-s[i]-1,g)*comb.F(g)%mod)%=mod;}cout<<ans<<endl;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 7:50:45

【R Shiny多模态交互实战】:掌握5种高阶图表控件设计技巧

第一章&#xff1a;R Shiny多模态交互概述R Shiny 是一个强大的 R 语言框架&#xff0c;用于构建交互式 Web 应用程序&#xff0c;尤其适用于数据可视化和统计分析场景。它允许用户通过浏览器与 R 代码进行实时交互&#xff0c;而无需深入掌握前端开发技术。Shiny 的核心优势在…

作者头像 李华
网站建设 2026/5/3 10:35:58

基于单片机的智能热水器的设计与实现

第一章 系统整体架构设计 基于单片机的智能热水器&#xff0c;核心目标是实现水温精准控制、能耗优化与安全防护&#xff0c;整体架构分为温度采集模块、核心控制模块、加热执行模块、人机交互模块及安全保护模块五大单元。温度采集模块实时监测水箱水温与进水温度&#xff0c;…

作者头像 李华
网站建设 2026/4/30 23:44:26

揭秘低代码环境下PHP组件权限漏洞:90%开发者忽略的3个致命陷阱

第一章&#xff1a;低代码环境下PHP组件权限校验的现状与挑战 在当前快速迭代的Web开发场景中&#xff0c;低代码平台凭借其可视化构建、拖拽式开发和自动化代码生成能力&#xff0c;显著提升了PHP应用的开发效率。然而&#xff0c;这种高效性背后也带来了权限校验机制弱化的风…

作者头像 李华
网站建设 2026/5/2 6:34:15

macOS使用Homebrew+VS Code搭建Python开发环境完整指南

文章目录通过 Homebrew 安装 Python1. 安装 Homebrew&#xff08;如已安装可跳过&#xff09;2. 使用 Homebrew 安装 Python33. 验证 Python 与 pip 是否安装成功安装 Visual Studio Code将 VS Code 界面切换为中文1. 打开扩展市场2. 安装官方中文语言包3. 应用语言设置配置 Py…

作者头像 李华