「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 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- 解决idea查不到插件
http://127.0.0.1:1080
- salesforce零基础学习(一百零三)项目中的零碎知识点小总结(五)
本篇参考:Salesforce Admin篇(四) Security 之Two-Factor Authentication & Single Sign On https://developer ...
- .NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)
需求背景: 在需要通过服务端请求传递文件二进制文件流数据到相关的服务端保存时,如对接第三方接口很多情况下都会提供一个上传文件的接口,但是当你直接通过前端Ajax的方式将文件流上传到对方提供的接口的时候 ...
- ARM NEON指令集优化理论与实践
ARM NEON指令集优化理论与实践 一.简介 NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bi ...
- PyTorch数据加载处理
PyTorch数据加载处理 PyTorch提供了许多工具来简化和希望数据加载,使代码更具可读性. 1.下载安装包 scikit-image:用于图像的IO和变换 pandas:用于更容易地进行csv解 ...
- git stash的常用操作
列出stash的: git stash list移除stash: git stash drop stash@{0}查看stash: git stash sho ...
- Django(63)drf权限源码分析与自定义权限
前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...
- 29.qt quick-在QML中调用C++类
1.Qml调用C++类 Qt QML模块提供了一组API,用来将C++类扩展QML中.您可以编写扩展来添加自己的QML类型,扩展现有的Qt类型,或调用无法从普通QML代码访问的C/C++函数本章将学习 ...
- 使用 Docker 部署 Node 应用 - 镜像文件尺寸的优化
前面 使用 Docker 部署 Node 应用 一文中完成了镜像的创建和运行,不过生成的镜像还有些粗糙,需要进一步优化. 镜像的优化 通过 docker images 看到简单的一个 node 服务端 ...
- 【linux】驱动-12-并发与竞态
目录 前言 12. 并发&竞态 12.1 并发&竞态概念 12.2 竞态解决方法 12.3 原子 12.3.1 原子介绍 12.3.2 原子操作步骤 12.3.3 原子 API 12. ...