「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 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- 游刃于私有网络与公共网络之间的NAT
网络地址转化技术NAT 1. 应用场景 2. NAT 2.1 静态NAT 2.2 动态NAT 2.3 NAPT 2.4 EASY IP 3. NAT配置 3.1 静态NAT 3.2 动态NAT 3.3 ...
- 郑政 | 2021软件代码开发技术作业四 | 需求改进&系统设计
需求改进&系统设计 -------------------------------------------------------------------------------------- ...
- H.264/H265码流解析
H.264/H265码流解析 一.H.264码流解析 一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成 一个原始的 ...
- Java IO学习笔记四:Socket基础
作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...
- .NET Core/.NET5/.NET6 开源项目汇总1:常用必备组件
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- PTA4题学习总结
前言: 这是我20多年以来第一次写博客了,还是在学校里那可(牛)爱(逼)的Java老师的安(逼)慰(迫)下,含泪写下第一篇博客,大家应该都明白这种含泪写下的佳(废)作(品)是多么的动人的. 就不开玩笑 ...
- 树的计数(prufer序列 或 purfer序列)
题解 首先我们要知道一条性质,prufer序列中的某个点出现次数为该点在树中度数-1 感性理解一下,其实按照prufer序列求法自己推一下就出来了 设题目里给的度为$d[]$ 先将所有的d-- 然后按 ...
- 一个SQLServer中JSON文档型数据的查询问题
近日在项目中遇到一个问题: 如何在报表中统计JSON格式存储的数据? 例如有个调查问卷记录表,记录每个问题的答案. 其结构示意如下(横表设计) Id user date Q1_Answer Q2_An ...
- React 并发功能体验-前端的并发模式已经到来。
React 是一个开源 JavaScript 库,开发人员使用它来创建基于 Web 和移动的应用程序,并且支持构建交互式用户界面和 UI 组件.React 是由 Facebook 软件工程师 Jord ...
- C#调用JAVA(二)调用方法
上期我们创建了jar包并放到了unity中,那么我们继续 如果您还没有看上一期请先看上一期,这是链接 C#调用JAVA(一)制作jar包 - 执著GodShadow - 博客园 (cnblogs.co ...