首页 > 其他分享 >[题解]P1641 生成字符串

[题解]P1641 生成字符串

时间:2024-11-22 16:57:35浏览次数:1  
标签:方案 int 题解 inv 合法 P1641 字符串 define 折线

P1641 [SCOI2010] 生成字符串

由题意可设\(f[i][j]\)表示用了\(i\)个\(0\),\(j\)个\(1\)的答案,那么有转移:

\[f[i][j]=\begin{cases} 0&i>j\\ f[i][j-1]&i=j\\ f[i-1][j]+f[i][j-1]&i<j\\ \end{cases}\]

状态数是\(O(n^2)\),转移是\(O(1)\),总时间复杂度\(O(n^2)\),期望得分\(30\text{ pts}\)。


我们用数形结合的方式思考:

如图,我们将填\(1\)视为向右走\(1\)个单位长度,填\(0\)视为向上走\(1\)个单位长度,最终到达\((n,m)\)视为完成,此时点的轨迹形成了一条折线。每条折线对应一种方案,总方案数是\(C_{n+m}^n\)。

显然,当前方案是合法的\(\iff\)折线的每个顶点都不在直线\(y=x\)上方。

换句话说,当前方案不合法\(\iff\)折线与\(y=x+1\)有交点。

对于每个不合法的方案,我们选定其中一个交点,将它之前的折线沿着\(y=x+1\)翻折,得到图中橙色的虚线。我们将橙色折线与剩余的红色折线形成的部分记作折线\(b\)。

可以发现,\(b\)可以取到的形态,与不合法的方案是一一对应的。

所以不合法的方案数就是从\((-1,-1)\)走到\((n,m)\)的方案数,即\(C_{n+m}^{n+1}\)。

因此合法方案数就是\(C_{n+m}^n-C_{n+m}^{n+1}\),可以化简得到\(\frac{(n+m)!\times (n-m+1)}{(n+1)!\times m!}\)。

Catalan数\(H_n=C_{2n}^n-C_{2n}^{n-1}\)可以由此题的结论推得,相当于此题\(n=m\)的情况。

计算它需要使用逆元,此处使用费马小定理。

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define N 1000010
#define mod 20100403
using namespace std;
int n,m,inv[N],inv_fact[N];
int fac(int r){
	int ans=1;
	for(int i=1;i<=r;i++) ans=ans*i%mod;
	return ans;
}
signed main(){
	cin>>n>>m;
	inv_fact[1]=inv[1]=1;
	for(int i=2;i<=n+1;i++) inv[i]=(-mod/i*inv[mod%i]%mod+mod)%mod;
	for(int i=2;i<=n+1;i++) inv_fact[i]=inv_fact[i-1]*inv[i]%mod;
	cout<<fac(n+m)*(n-m+1)%mod*inv_fact[n+1]%mod*inv_fact[m]%mod<<"\n"; 
	return 0;
}

标签:方案,int,题解,inv,合法,P1641,字符串,define,折线
From: https://www.cnblogs.com/Sinktank/p/18562200

相关文章

  • 泷羽Sec学习笔记:shell(2)永久环境变量和字符串显位
    学习笔记:shell编程(2)永久环境变量和字符串显位_哔哩哔哩_bilibili永久变量:echo$PATH 查看环境变量echo$HOME  家目录root用户我们使用的ls、dir命令能输出内容就是因为这些命令都有相对应的变量。which--als  查看ls命令的脚本路径查看echo$PATH:/usr/l......
  • C语言字符串处理相关函数
    作用:处理字符串,如计算字符串长度,查找字符串中指定的字符或字符串,切割字符串等头文件:string.h相关函数:strlen作用:测量字符串长度语法:size_tstrlen(constchar*s);    参数:s:要测量的字符串的首地址    返回值:测量的字符串串长度注意:不包含......
  • [题解]P2151 [SDOI2009] HH去散步
    P2151[SDOI2009]HH去散步发现\(n,m\)非常小而\(t\)非常大,所以果断考虑矩阵。这道题如果不限制“不能立即沿刚刚过来的路回去”,就直接用邻接矩阵求\(t\)次幂然后直接调用\(ans[a][b]\)就好了。加上限制后,我们用点就比较难考虑了,因为点是无方向的。我们可以试着用边来转移,和点......
  • 超全!python中字符串拼接的各种姿势
    Python提供了多种字符串拼接的方式,每种方式在性能、可读性和灵活性上各有特点。以下是常见的字符串拼接方式及其总结:1.使用+操作符s1="Hello"s2="World"result=s1+""+s2#HelloWorld特点:简单易懂,适合小规模拼接。多个+拼接可能生成多个中间字符......
  • Shell脚本入门指南(二):环境变量与字符串操作
    声明学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站......
  • CF1375题解
    CF评分2693,豆瓣拒绝评分,这套题啥实力就不用说了CF1375A被爆切了(悲,md想了20分钟没有想出来,然后就看了一眼题解,wc这不直接一正一负就解决了吗。。。脑子不转了CF1375B切了,首先有一组必然合法的解,就是把所有数都变为大于0的数,这样必然是最大的解,若\(a[i]\)还有比这组解大的就......
  • 力扣面试题 - 25 二进制数转字符串
    题目:二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。示例1:输入:0.625输出:"0.101"示例2:输入:0.1输出:"ERROR"提示:0.1无法被二进制准确表示提示:32位包括输......
  • Atcoder Regular Contest 061 题解
    ARC061C.ManyFormulas*1089首先预处理出原数区间\([i,j]\)所代表的真实数字。然后注意到\(|s|\leq10\),所以直接爆搜回溯最后判断即可。或者状压枚举也可以,反正非常简单。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;strings;LLSum[11][11]......
  • 2024考前集训测试37 错峰旅行 题解
    题目描述小Z终于迎来了自己的大学生活最后的时刻,他决定用自己的积蓄来一场说走就走的毕业旅行,并且不玩的开心不上班。然而,他很快就发现这个决定并非那么简单。由于是暑假,假期人多,他既不想错过旅行的最佳时期,又不想在人群中挣扎,预测旅游热门城市的拥挤时段,就像是一道难题摆在他......
  • ybtoj 高效进阶题解索引
    密码:sunxuhetai2009--------------------云落的分割线--------------------基础算法第1章-递推算法第2章-贪心算法--------------------云落的分割线--------------------图论第1章-并查集第4章-强连通分量--------------------云落的分割线--------------------......