首页 > 其他分享 >CF1924D Balanced Subsequences 题解

CF1924D Balanced Subsequences 题解

时间:2024-04-04 23:22:58浏览次数:32  
标签:md CF1924D ifac int 题解 ll ans Balanced fac

先判掉 \(k>\min(n,m)\) 的情况。

首先有个明显的计算最长合法括号子序列的贪心方法:初始一个值为 \(0\) 的计数器,从左到右枚举每个字符,遇到 ( 时将计数器加一,遇到 ) 时如果计数器不为 \(0\) 就减一然后将答案加一。

考虑绘制它的折线图。初始时纵坐标为 \(0\),从左到右枚举每个字符,遇到 ( 加一,遇到 ) 减一。考虑有多少个 ) 不会被匹配到,即在开头需要加入的最少 ( 的数量使得折线不会有在横轴下方的部分。于是题目中的限制就转化为了要使折线能到达的最低点纵坐标为 \(k-m\)。

记 \(f(k)\) 表示能到达的最低点纵坐标为 \(k-m\) 的折线个数,那么答案就是 \(f(k)-f(k-1)\)。考虑将折线最后一次碰到直线 \(y=k-m\) 以后的部分上下翻转,那么就转化为了从 \((0,0)\) 走到 \((n+m,2k-m-n)\) 的路径方案数,组合数直接求即可。

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 4003
#define md 1000000007
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
int t,n,m,k;
ll fac[mxn],ifac[mxn];
ll power(ll x,int y){
	ll ans=1;
	for(;y;y>>=1){
		if(y&1)ans=ans*x%md;
		x=x*x%md;
	}
	return ans;
}
inline ll C(int n,int m){
	if(n<m||m<0)return 0;
	return fac[n]*ifac[m]%md*ifac[n-m]%md;
}
int f(int k){
	return C(n+m,(n+m-(2*k-m-n))>>1); 
}
void init(int n){
	fac[0]=1;
	rep(i,1,n)fac[i]=fac[i-1]*i%md;
	ifac[n]=power(fac[n],md-2);
	drep(i,n,1)ifac[i-1]=ifac[i]*i%md; 
}
signed main(){
	init(4e3);
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&n,&m,&k);
		if(k>min(n,m)){
			puts("0");
			continue;
		}
		cout<<(f(k)-f(k-1)+md)%md<<'\n'; 
	}
	return 0;
}

标签:md,CF1924D,ifac,int,题解,ll,ans,Balanced,fac
From: https://www.cnblogs.com/zifanoi/p/18115318

相关文章

  • 小猫爬山 C++题解
    小猫爬山内存限制:256MiB时间限制:1000ms标准输入输出题目类型:传统评测方式:文本比较题目描述Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。Freda和rainbow只好花钱让它......
  • git clone失败问题解决
    gitclone失败问题解决背景当gitclone出现以下问题时:error:RPCfailed;curl92HTTP/2stream5wasnotclosedcleanly:CANCEL(err8)error:5492bytesofbodyarestillexpectedfetch-pack:unexpecteddisconnectwhilereadingsidebandpacketfatal:earlyE......
  • 小木棍 C++题解
    小木棍内存限制:1024MiB时间限制:1000ms标准输入输出题目类型:传统评测方式:文本比较题目描述乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每......
  • 高手训练 负环 题解
    题目链接方向:枚举点的个数,找出其中边权和为负数的最小值。直接枚举显然会超时,不妨考虑使用倍增凑出点的个数(注意:点数不完全有单调性,但是后面会提到如何转化处理)。先预处理出\(dis_{t,i,j}\)表示经过\(t\)条边,从\(i\rightarrowj\)的最短路长度。那么类似\(Floyed\)显然......
  • 少儿编程 2024年3月电子学会图形化编程等级考试Scratch一级真题解析(选择题)
    2024年3月scratch编程等级考试一级真题选择题(共25题,每题2分,共50分)1、单击下列哪个按钮,能够让舞台变为“全屏模式”A、B、C、D、答案:C考点分析:考查scratch平台的使用,四个选项分别是:开始程序,停止程序,全屏模式,恢复正常模式,答案C2、下列哪个选项可以将当前背景换成第二......
  • win server系统物理机转成虚拟机出现 计算机丢失api-ms-win-crt-stdio-|1-1-0.dll问题
     物理机转移虚拟机的方案有很多种,这里讲下官方的这个转移工具转移,很简单下载下来一步步跟着点就好了。但是server系统的话可能会出现如图这样子的报错,缺少dll文件,这是因为server系统本身缺少这个文件组,解决方式有两种:1.去下载dll表文件,放置对应的文件夹下面,重新迁移2.利用......
  • C语言 | Leetcode C语言题解之第8题字符串转换整数atoi
    题目:题解:intmyAtoi(char*s){inti=0;intout=0;intpol=1;intlen=strlen(s);if(len==0)return0;while(s[i]=='')i++;//删除空格if(s[i]=='-'){//判断正负pol=-1;i++;}else......
  • Delving into Sample Loss Curve to Embrace Noisy and Imbalanced Data
    这篇论文:提出了prob-and-allocate训练策略,在prob阶段获得样本损失,在allocate阶段分配样本权重。以[2]的meta-weight-net为Baseline,取名为CurveNet,进行部分改动。另外,这篇论文提供的源码结构混乱,复现难度较大。主要的工作也是基于meta-weight-net,创新的内容有限。但是,这篇文章......
  • Java | Leetcode Java题解之第10题正则表达式匹配
    题目:题解:classSolution{publicbooleanisMatch(Strings,Stringp){intm=s.length();intn=p.length();boolean[][]f=newboolean[m+1][n+1];f[0][0]=true;for(inti=0;i<=m;++i){......
  • Java | Leetcode Java题解之第9题回文数
    题目:题解:classSolution{publicbooleanisPalindrome(intx){//特殊情况://如上所述,当x<0时,x不是回文数。//同样地,如果数字的最后一位是0,为了使该数字为回文,//则其第一位数字也应该是0//只有0满足这一属......