「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的更多相关文章

  1. 「MoreThanJava」Day 4:面向对象基础

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  2. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  3. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  4. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  5. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  6. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  7. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  8. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  9. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

随机推荐

  1. 根据某个数据 来筛选 DataTree 分支数里面的数据是否符合规则 进行筛选分支,展示

    问题:如何在 DataTree 树形数据里每个分支里根据特定某个元素值,然后挑选出来 思路:先把分支提取出来,每个都要进行判断. 主要用到的电池: >.Cull Pattern 拓展资料:以下是 ...

  2. Proteus中包含的传感器类型(Transducers)

    1. 传感器列表 2. 部分传感器的测量电路 (1)光照传感器,搭采样电阻,测电压输出. (2)距离传感器,带采样电阻,测电压输出. (3)粉尘传感器,测PWM脉宽 其余传感器多为总线类型的传感器,各 ...

  3. 自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR)

    自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR) 据麦姆斯咨询报道,2032年全球范围内自动驾驶汽车的产量将高达2310万辆,未来该市场的复合年增长率(CAGR)高达58%.届时 ...

  4. 人脸标记检测:ICCV2019论文解析

    人脸标记检测:ICCV2019论文解析 Learning Robust Facial Landmark Detection via Hierarchical Structured Ensemble 论 ...

  5. NVIDIA CUDA-X AI

    NVIDIA CUDA-X AI 面向数据科学和 AI 的 NVIDIA GPU 加速库 数据科学是推动 AI 发展的关键力量之一,而 AI 能够改变各行各业. 但是,驾驭 AI 的力量是一个复杂挑战 ...

  6. 分布式系统ID的生成方法之UUID、数据库、算法、Redis、Leaf方案

    一般单机或者单数据库的项目可能规模比较小,适应的场景也比较有限,平台的访问量和业务量都较小,业务ID的生成方式比较原始但是够用,它并没有给这样的系统带来问题和瓶颈,所以这种情况下我们并没有对此给予太多 ...

  7. 基于ABP落地领域驱动设计-01.全景图

    什么是领域驱动设计? 领域驱动设计(简称:DDD)是一种针对复杂需求的软件开发方法.将软件实现与不断发展的模型联系起来,专注于核心领域逻辑,而不是基础设施细节.DDD适用于复杂领域和大规模应用,而不是 ...

  8. Java-Lambda相关使用介绍

    频繁使用的语句   Lambda又涉及到comparator和comparable区别(Comparable是实现comparable接口,实现后可以使用Collections.sort或Arrays ...

  9. @Autowired报错原因分析和4种解决方案!

    上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错,但程序却能正常的执行,那这其中的原因又是为何? ​ 报错原因分析 报错的原因 ...

  10. 02 jumpserver系统设置

    2.系统设置: (1)基本设置: (2)邮件设置: 1)163邮箱设置: 2)在jumpserver上填写邮箱信息: 3)邮件测试信息如下: (3)邮件内容设置: (4)终端设置: (5)安全设置: