首页 > 其他分享 >AGC021E Ball Eat Chameleons 题解

AGC021E Ball Eat Chameleons 题解

时间:2023-06-24 16:55:49浏览次数:43  
标签:Ball 红球 题解 ll 变色龙 蓝球 text AGC021E jc

本文网址:https://www.cnblogs.com/zsc985246/p/17501300.html ,转载请注明出处。

传送门

AGC021E Ball Eat Chameleons

题目翻译

有 \(n\) 只变色龙,一开始都是蓝色。

你会依次扔出 \(k\) 个球,每次扔出都要指定一只变色龙吃掉这个球。扔出的球可以是红色或蓝色。

变色龙从蓝色变成红色当且仅当它吃的红球比蓝球多,从红色变成蓝色当且仅当它吃的蓝球比红球多。

求最后能使所有变色龙都变成红色的方案数,对 \(998244353\) 取模。

两个方案不同当且仅当至少一次喂的球颜色不同

思路

注意到,一条变色龙最终为红色只有两种情况:

  1. 吃的红球比蓝球多。

  2. 吃的红球和蓝球一样多,但吃的最后一个球是蓝球。

所以我们尝试分情况考虑。

我们设扔出的红球个数为 \(R\),蓝球个数为 \(B\),其中 \(R+B=k\)。

  • \(R < B\)

    此时必定有变色龙吃的蓝球比红球多,所以一定无解

  • \(R \ge B + n\)

    让除第一条外的变色龙都只吃一个红球,那么剩下的球满足 \(R' > B'\),全部丢给第一条变色龙就可以了,所以一定有解。答案为 \(C_{R+B}^{R}\)。

  • \(B \le R < B + n\)

    • \(R = B\)

      此时只能让每条变色龙都吃相同数量的红球和蓝球。

      那么显然,合法方案的最后一个球一定为蓝球

      所以其实可以等价于长度为 \(n-1\),满足 \(R'=R,B'=B-1\) 的合法方案数。

      这样我们就将 \(R=B\) 转化为了 \(B < R < B + n\) 的情况。

    • \(B < R < B + n\)

      我们有多出来的 \(R-B\) 个红球,所以我们可以让 \(R-B\) 条变色龙吃的红球比蓝球多。我们称这些变色龙为 \(\text{I}\) 类变色龙。

      我们还剩下 \(n-(R-B)\) 条 \(\text{II}\) 类变色龙。我们可以如果可以选出这么多对红球+蓝球 的组合,分给每条 \(\text{II}\) 类变色龙,然后将剩下的球全部给一条 \(\text{I}\) 类变色龙就可以满足条件。

      但如果我们无法选出足够多对红球+蓝球 ,那么显然一定会有 \(\text{II}\) 类变色龙无法变成红色,所以一定无解。

      综上可知,如果我们可以选出 \(n-(R-B)\) 对红球+蓝球 的组合,则有解,否则一定无解。

      这其实与卡特兰数的模型很像。我们当前在 \((0,0)\),向右表示红球,向上表示蓝球,目标点是 \((R,B)\),而我们不能走到直线 \(y=x+B-(n-(R-B))=x+R-n\) 的严格上方。

      那么我们通过组合数得到答案为 \(C_{R+B}^{R}-C_{R+B}^{2R-n+1}\)。

然后我们只需要枚举 \(R\),通过组合数计算答案。

代码实现

#include<bits/stdc++.h>
#define ll long long
#define For(i,a,b) for(ll i=(a);i<=(b);++i)
#define Rep(i,a,b) for(ll i=(a);i>=(b);--i)
#define pb push_back
const ll N=2e6+10;
using namespace std;
const ll p=998244353;
//组合数模板
ll ksm(ll a,ll b){ll bns=1;while(b){if(b&1)bns=bns*a%p;a=a*a%p;b>>=1;}return bns;}
ll jc[N],inv[N];
void init_C(ll n){jc[0]=jc[1]=1;For(i,2,n)jc[i]=jc[i-1]*i%p;inv[n]=ksm(jc[n],p-2);Rep(i,n-1,0)inv[i]=inv[i+1]*(i+1)%p;}
ll C(ll n,ll m){if(n<m)return 0;/*记得特判*/return jc[n]*inv[m]%p*inv[n-m]%p;}

int main(){
	ll n,k;
	scanf("%lld%lld",&n,&k);
	if(k<n){
		printf("0");
		return 0;
	}
	init_C(2*k);//组合数预处理
	ll ans=0;
	For(R,1,k){
		ll B=k-R;
		if(R<B)continue;
		if(R==B)B--;
		//R>=B+n也可以用这个公式,因为R-n>=B,所以2*R-n+1>=R+B+1,即后面的组合数返回0
		ans=(ans+C(R+B,R)-C(R+B,2*R-n+1)+p)%p;
	}
	printf("%lld",ans);
    return 0;
}

尾声

如果你发现了问题,你可以直接回复这篇题解

如果你有更好的想法,也可以直接回复!

标签:Ball,红球,题解,ll,变色龙,蓝球,text,AGC021E,jc
From: https://www.cnblogs.com/zsc985246/p/17501300.html

相关文章

  • 【Debian】更换阿里源出现的Certificate问题解决方法
    系统版本Debian11源配置debhttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdeb-srchttps://mirrors.aliyun.com/debian/bullseyemainnon-freecontribdebhttps://mirrors.aliyun.com/debian-security/bullseye-securitymaindeb-src......
  • [ABC259F] Select Edges 题解
    Solution考虑树形\(dp\)。我们可以注意到节点\(i\)的相邻的边中被选中的不超过\(d_i\)条,显然我们可以定义状态\(dp_{u,k}\)表示节点\(u\)连接子节点的边有\(k\)条的最大值。但是此处没有给定\(d_i\)的范围,所以对于一个节点最多可能会有\(n-1\)个点,所以时间复杂......
  • 牛客题解-mixup2混乱的奶牛(状压dp)
    题解-mixup2混乱的奶牛[原题连接](1026-mixup2混乱的奶牛_2021秋季算法入门班第八章习题:动态规划2(nowcoder.com))题目描述混乱的奶牛[DonPiele,2007]FarmerJohn的N(4<=N<=16)头奶牛中的每一头都有一个唯一的编号S_i(1<=S_i<=25,000).奶牛为她们的编号感到骄傲......
  • P4920 题解
    前言题目传送门!更好的阅读体验?没看题解把未来程序切了,很高兴,来写篇题解!这篇题解在博客园里观看,效果明显更佳,请前往博客园。Program1简单的。显然答案为\((a\timesb)\bmodc\),转成__int128后暴力乘即可。代码有手就行。Program2简单的。给定\(n\)与\(mod\),有递推......
  • 春秋杯春季联赛&&ciscn2023华北赛区部分题解
    前言复现几个比赛时没做出来的题1.[CISCN2023华北赛区]ez_ruby查文档可知ruby内置的open函数,如果第一个字符是管道符|,后面就可以接命令。这可能是考察涉猎的知识范围广不广吧。直接nc反弹shell即可2.[CISCN2023华北赛区]ExifTool看着天枢佬复现的,说是非预期,不知道预......
  • 【题解】AtCoder-ABC306G Return to 1
    这也太强了!容易想到的是用若干环拼出这个\(10^{10^{100}}\),也就是这些环的\(\gcd\mid10\)。之后就不会了。先正图反图两次DFS,只留下\(1\)所在强连通分量里的边,对正图跑DFS生成树,定义其深度从\(0\)开始,然后有一个结论是:对于任何正整数\(a\),图中存在一个包含\(1\)......
  • 2023年最新5000道校招常用编程面试题分享(附详细题解)
    截止到2021年最新,本资源整理了近5000道校招常用面试题,并附带详细的解题思路及代码,包含leetcode,校招笔试题,面试题,算法题,语法题。持续更新中。。。目录内容截图......
  • P8477 「GLR-R3」春分 题解
    更好的阅读体验牛逼逼题。Subtask1直接暴力,每个实验配一块板。需要\(n^2\)块板。cout<<n*n<<'\n';for(inti=1;i<=n;++i){for(intj=1;j<=n;++j){cout<<"1"<<i<<''<<++c<......
  • WGCLOUD在windows启动server - dos窗口显示乱码的问题解决
    首先,这个乱码没有影响,忽略即可这个是windows窗口编码导致的,不会影响程序运行,server/log下日志文件没有出现乱码,我们主要看日志文件如果我们想处理,也可以的,修改server/start.bat,添加一行命令,chcp65001,如下echo%cd%start/d"%cd%"wgcloud-daemon-release.exechcp65001java-......
  • AT_abc118_d题解
    ATLuogu题目描述有\(n\)根火柴\(m\)种数字,数字\(1,2,3,4,5,6,7,8,9\)分别需要\(2,5,5,4,5,6,3,7,6\)根火柴,要求\(n\)根火柴全部都用完且拼成的数字最大,输出这个数字。输入格式第一行两个整数\(n\),\(m\);第二行\(m\)个整数,分别为\(a_1,a_2,...,a_m\)(即\(m\)种......