「AGC021E」Ball Eat Chameleons
「AGC021E」Ball Eat Chameleons
考虑如何判定一个合法的颜色序列。
不妨设颜色序列中有 \(R\) 个红球,\(B\) 个蓝球,所以有 \(R+B=k\)。
考虑分情况讨论:
\(R<B\)
显然无解。
\(R\ge B\)
\(R\ge B+n\)
显然任意一种序列都合法,因为对于任意一个白球,无论你给一条变色龙分配多少个蓝球,你总能分配更多的红球给这条变色龙,使其变为红色。
直接计算即可。
$ B\le R < B+n$
\(R=B\)
此时对于每一个蓝球,都只有唯一的一个红球与之对应。也就是说,对于某只变色龙,蓝球一定要比红球后分配,否则这只变色龙一定仍然为蓝色。
根据这一点,我们可以知道此时合法的颜色序列的最后一个球的颜色一定是蓝色。
然后,我们就可以转化为长度为 \(n-1\) 的子序列,且 \(R^{\prime}=R,B^{\prime}=B-1\) 的子问题。
\(R>B\)
实际上我们只需要考虑这种情况的问题。
这意味着有 \(R-B\) 只变色龙只用吃一个红球,而对于其他的 \(n-(R-B)\) 条变色龙,他们需要吃等量的红球和蓝球,且需要保证他们最后吃的那个球一定是蓝色。
那么考虑一种最坏情况就是,对于这些要吃红蓝球的变色龙,他们每条龙都差一个就吃满了所有的蓝球,然后这时候吃完所有的红球,再把最后一个蓝球补齐。
也就是说,\(\max\{B-R\}=B-(n-(R-B))=R-n\)。
我们可以把问题抽象为每次可以移动一个单位向量 \((0,1)\) 或 \((1,0)\),问从 \((0,0)\) 到 \((R,B)\) 的合法路径数。
那么问题就变成了不经过 \(y=x+(R-n)\) 的路径的方案数。
根据翻折的性质,答案就等于所有的方案数到减掉将终点关于直线对称后的新终点的方案数。
即
\[\binom {R+B}{R}-\binom{R+B}{2R-n+1}
\]
枚举 \(R\) 计算即可。
时间复杂度为 \(O(k)\)。
/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=2e6+5;
const ll p=998244353;
ll ksm(ll a,ll b,ll p){
ll ans=1;
while(b){
if(b&1) ans=1ll*ans*a%p;
b>>=1,a=1ll*a*a%p;
}
return ans;
}
ll inv[maxn],fac[maxn];
ll C(ll n,ll m){
if(n<m) return 0;
return 1ll*fac[n]*inv[m]%p*inv[n-m]%p;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll n,k;cin>>n>>k;
if(k<n) cout<<0<<'\n',exit(0);
fac[0]=inv[0]=1;
for(ll i=1;i<=2*k;++i){
fac[i]=1ll*fac[i-1]*i%p;
}
inv[2*k]=ksm(fac[2*k],p-2,p);
for(ll i=2*k-1;i>=1;--i) inv[i]=1ll*(i+1)*inv[i+1]%p;
ll ans=0;
for(ll r=1;r<=k;++r){
ll b=k-r;
if(r<b) continue;
if(r==b) --b;
ans=1ll*(ans+1ll*(C(r+b,r)-C(r+b,2*r-n+1)+p)%p)%p;
}
cout<<ans<<'\n';
return 0;
}
「AGC021E」Ball Eat Chameleons的更多相关文章
- 「MoreThanJava」Day 4:面向对象基础
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- 实战|教你用Python玩转Mysql
爬虫采集下来的数据除了存储在文本文件.excel之外,还可以存储在数据集,如:Mysql,redis,mongodb等,今天辰哥就来教大家如何使用Python连接Mysql,并结合爬虫为大家讲解. 前 ...
- Pandas之:深入理解Pandas的数据结构
目录 简介 Series 从ndarray创建 从dict创建 从标量创建 Series 和 ndarray Series和dict 矢量化操作和标签对齐 Name属性 DataFrame 从Seri ...
- P2365 任务安排
题目描述 n 个任务排成一个序列在一台机器上等待完成(顺序不得改变),这 n 个任务被分成若干批,每批包含相邻的若干任务. 从零时刻开始,这些任务被分批加工,第 i 个任务单独完成所需的时间为 ti ...
- 阿里云视频云 Retina 多媒体 AI 体验馆开张啦!
带你体验视频更多可能 海量视频管理难度大?翻库检索特定人物费时费力?视频内容剪辑效率低?您的得力助手"Retina多媒体AI"体验馆已上线.带你感受视频AI黑科技,开启极致智能体验 ...
- mysqldump 使用规范
数据库很重要,没有备份,数据丢失只能跑路.所以还是做好备份吧! 目录 一.工具介绍 二.工具特点 三.备份权限 四.工具使用限制 五.已知BUG 六.备份前注意事项 6.1 需要长时间备份或导入时,请 ...
- NX二次开发-将3X3矩阵修正为正交且长度为单位长度的矩阵
函数:UF_MTX3_ortho_normalize() 函数说明:将矩阵修正为正交且xyz长度为单位长度的矩阵.下图中输入的矩阵为三条线段的端点,经过修正后,生成一个坐标系. 1 #include ...
- 10:ValueError: Cannot assign "'2'": "Comment.article" must be a "Article" instance
报错中出现类似ValueError: Cannot assign "'XXX'": "Comment.article" must be a "XXX& ...
- docker2-镜像原理及创建新的镜像
1,镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 在docker中所有应用 ...
- 精尽Spring Boot源码分析 - Jar 包的启动实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- excel函数提取内容中的汉字
RIGHT(A2,LENB(A2)-LEN(A2)) 函数LENB将每个汉字(双字节字符)的字符数按2计数,LEN函数则对所有的字符都按1计数.因此"LENB(A2)-LEN(A2)&quo ...