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

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;}
http://www.cnnetsun.cn/news/68112.html

相关文章:

  • 基于单片机的铁轨长度检测系统
  • 豆包手机助手回应“获取受保护内容”质疑;京东招募端侧AI芯片人才:月薪25K-100K;iOS26出现离奇Bug | 极客头条
  • PHP 8.6性能监控从入门到精通(仅限高级工程师掌握的技术细节)
  • Qt 6 高性能 RTP 实时音频流监听、解码、丢帧播放与波形可视化架构研究报告
  • TeleTron项目技术优化原理之上下文并行技术
  • Simulink上四永磁同步电机偏差耦合转速同步控制仿真模型的设计与实现
  • 生成式深度学习(文本生成)
  • 39、gawk 扩展:文件函数的实现与应用
  • 40、深入了解gawk扩展功能与编程接口
  • 为什么你的Rust-PHP扩展无法运行?:一文搞懂ABI兼容与PHP模块版本映射
  • 42、《gawk安装与使用全指南》
  • 如何通过AI销冠系统,实现数字员工效率的质变?
  • 兼容性双突破,低门槛部署实测!IPTV 电视源码系统 2025
  • plsql提示款报错乱码
  • 为什么Laravel 13的多模态存储设计让90%的开发者拍案叫绝?
  • 【计算机毕设选题】基于Spark的公务员招录职位信息可视化分析系统源码,Python大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习
  • 如何利用微信个人号API接口进行二次开发?
  • Symfony 8服务注册中心性能优化指南(提升响应速度300%)
  • 3、CentOS 7 入门:Bash shell 与文件系统导航
  • 2025年低成本提升AI能力:CAIE认证的高性价比之选
  • 2025应届生AI证书避坑指南:CAIE认证成优选
  • 如何利用PHP 8.6的JIT指令优化实现毫秒级响应?
  • 【Symfony 8路由安全进阶指南】:掌握参数验证的5大核心技巧
  • 从传感器到图表:PHP实现农业数据实时可视化的5个关键步骤
  • 业务导向型技术日志首日记录(业务中使用的技术栈)
  • 基于SpringBoot + Vue的宠物殡葬网站设计
  • 基于Uniapp + SpringBoot + Vue的中医个性化养生系统的设计与实现
  • 亲测有效:打印机驱动程序无法使用的完整解决思路
  • ollama pull qwen:32b命令执行失败原因排查
  • 基于Uniapp + SpringBoot + Vue的高校就业招聘系统的设计与实现