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

P12028 [USACO25OPEN] Moo Decomposition G 题解

P12028 [USACO25OPEN] Moo Decomposition G 题解

题目传送门

我的博客

前言

涉及知识:阶乘、逆元、组合数。

思路

拿到这道题,相信数学比较好的人已经有想法了——一定和组合数相关。

为什么呢?看下面这个例子。

MOOOO...OOOO//共有 n 个 O

那这个字符串分解出的子序列个数(这里请先忽略本题中每个子序列均需合法的这个条件)是不是就是 \(C_{n}^{k}\) 吗。

那么,对于每个M,都是与这个M后面O的个数有关的组合数吗?

不完全是。比如样例 \(1\)。第一个M后面有 \(4\)O,但是显然不能任取两个,因为这样的话另一个子序列就不合法了。如下。

MOomoO//小写的子序列不合法

所以我们需要倒着枚举,且必须保证每个子序列均合法。

那么哪些O可以对它之前的M有作用呢?

只需要保证从后向前的每个M的后面都有 \(k\)O即可。于是我们每次遇到O就让 \(cnt\)\(1\),每次遇到M就让 \(cnt\)\(1\),同时统计 \(C_{cnt}^k\)

再想有 \(L\) 个串 \(S\) 拼在一起。先说结论:每个串都可以独立求贡献,每个串 \(S\) 对前后两个串不会产生贡献。证明如下。

如果一个串对前后的串有贡献,那么必然为 \(S=\)O......M这种类型。可是如果串 \(S\) 在开头,那么第一个字符O必然是不合法的(因为它前面没有可以与之匹配的M)。如果 \(S\) 在结尾,那么最后一个字符M必然是不合法的(因为它后面没有O)。因此,每个串必然不会对前后相邻的串有贡献。因此每个串可以单独计算。

所以只需要求一个串的方案数 \(ans\),最终答案为 \(ans^L\)

总结

  1. 每个串单独求方案数。
  2. 从后向前枚举,按照上述方式进行统计。
  3. 最终答案为 \(ans^L\)

警示后人

  • 勤取模!
  • 认真读题,形如每个子序列之类的字眼看仔细。
  • 十年OI一场空,不开________见祖宗

代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define int long long 
#define ___ __int128
#define INF 0x3f3f3f3f3f3f3f3f 
inline int Read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-48;c=getchar();}return x*f;
}
inline void Write(int x){if(x<0) {putchar('-');x=-x;}if(x>9) Write(x/10);putchar(x%10+'0');
}
const int N=1e6+10;
const int mod=1e9+7;
int k,n,m,t,ans;
int jc[N],inv[N];
//jc:阶乘,inv:逆元
string s;
int qsm(int a,int b){//快速幂板子int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}
int C(int n,int m){//组合数,也可以用杨辉三角实现if(m>n) return 0;return jc[n]%mod*inv[n-m]%mod*inv[m]%mod;
}
void init(){//求阶乘、逆元jc[0]=1;//别忘了赋初值for(int i=1;i<=n;i++) jc[i]=jc[i-1]*i%mod;//阶乘inv[n]=qsm(jc[n],mod-2);for(int i=n-1;i>=0;i--){//倒叙线性求逆元inv[i]=inv[i+1]*(i+1)%mod;}
}
signed main(){k=Read();n=Read();m=Read(); //m==Lcin>>s;s=" "+s;//s 串下标从 1 开始init();//别忘了加到主函数里面ans=1;t=0;//t:当前可用的 O 的数量for(int i=n;i>=1;i--){//倒叙if(s[i]=='O') t++;else {ans*=C(t,k)%mod;ans%=mod;t-=k;//需要给当前 M 留下 k 个 O}}ans=qsm(ans,m)%mod;printf("%lld\n",ans);return 0; 
}
http://www.zskr.cn/news/40023.html

相关文章:

  • Automation 错误
  • 【AI智能体】Coze 打造AI数字人视频生成智能体实战详解 - 教程
  • 基于GA-SVM的织物瑕疵种类识别算法matlab仿真,包含GUI界面 - 实践
  • 软件工程学习日志2025.11.4
  • go语言访问新浪股票
  • Hugging Face的基础使用
  • 2025上海SAT线上培训机构推荐:线上课程首选“无老师国际教育”
  • Java基础加强13-集合框架、Stream流 - 指南
  • 高级语言程序第三次作业 - 102300317
  • Scaling Law至现有AI即将跌落神坛?AI大模型的“增长神话”是否正在崩塌-上篇 - 实践
  • The 2024 ICPC Asia Nanjing Regional Contest (The 3rd Universal Cup. Stage 16: Nanjing) 题解
  • 完整教程:四大名著智能可视化推演平台
  • 2025年靠谱的气体探测器专业厂家推荐,气体探测器企业全解析
  • 2025年重庆正宗陈麻花品牌口碑排名:陈建平麻花客户评价如何、性价比怎么样、价格合理吗全解析
  • Introduction to Microsoft Visual C++/MFC
  • 收藏!计算机领域除顶会外,这6大核心期刊你绝不能错过
  • 2025年沈阳编程机构权威推荐榜单:spike编程/scratch编程/python编程源头机构精选
  • Gitlab通过Token生成的用户怎么删除
  • Prometheus监控系统安装
  • 2025年诚信的PU线条厂家TOP5推荐,PU线条厂家全解析
  • 2025年代办注册公司哪家口碑好?代办注册公司找哪家?
  • 2025 年散热器厂家最新推荐榜:涵盖电子 / 插片 / 型材 / 铲齿 / 新能源等多品类,权威测评精选实力企业
  • 2025 年过滤器厂家最新推荐榜单:品牌综合实力测评发布,五大优质企业脱颖而出润滑油过滤器/自清洗过滤器/全自动除污过滤器/双联过滤器/烛式过滤器厂家推荐
  • docker学习笔记详记 - 教程
  • 浏览器共享存储导致身份标识冲突
  • 2025数证杯初赛
  • Mybatisplus 如何将已经有值的字段设置为空值null
  • 2025 年上海商用净水器租赁公司最新推荐榜,技术实力与市场口碑深度解析,助力精准选品工厂,事业单位,办公净水器租赁企业
  • 2025年尼龙拉链供货厂家权威推荐榜单:树脂拉链/金属拉链/隐形拉链源头厂家精选
  • 详细介绍:MySQL主从复制:数据同步实战指南