E - Ball Eat Chameleons

设颜色序列中有\(R\)个红球,\(B\)个蓝球,且有\(B+R=k\)

然后分类讨论:

  • \(R<B\) 无解

  • \(R>B\)

这时有一种合法方案为:\(R-B\)只变色龙只用吃一个红球,剩下的\(n-(R-B)\)只变色龙吃的红球和蓝球的数量相等且最后吃的那个球是蓝球

对于\(n-(R-B)\)只变色龙,称它们为\(bsl\),有一种极端情况:若第\(i\)只变色龙要吃\(x_i\)个蓝球,\(x_i\)个红球,那么所有\(bsl\)一起先吃了对应的\(x_i-1\)个蓝球,再一起吃了对应的\(x_i\)个红球,最后再一起吃一个蓝球(这里的一起不是指的同时,而是指的这些操作都是相邻的)

这时,在操作期间,设当前所有变色龙吃了的红球数量为\(r\),蓝球数量为\(b\),那么有:

\[\max(b-r)=B-(n-(R-B))=R-n
\]

所以,我们就可以将操作抽象为从\((0,0)\)开始,每次可以移动一个单位向量\((0,1)\)或\((1,0)\),求从\((0,0)\)移动到\((R,B)\)且不经过\(y=x+(R-n+1)\)的方案数

因为\(y=x+(R-n)\)是合法的,所以要\(+1\)

于是就是经典的翻折,答案为总方案数减去将终点关于直线对称后的新的终点的方案数

翻折:将不合法的方案中,第一次触碰到\(y=x+(R-n+1)\)及之后的折线全部关于\(y=x+(R-n+1)\)翻转,这样就得到了一条从\((0,0)\)到\((B-(R-n+1),R+(R-n+1))\)的路径

显然又所有的从\((0,0)\)到\((B-(R-n+1),R+(R-n+1))\)的路径都唯一对应了一条不合法的路径且任意一条不合法的路径都有对应的从\((0,0)\)到\((B-(R-n+1),R+(R-n+1))\)的路径

所以不合法的路径的方案数就是从\((0,0)\)到\((B-(R-n+1),R+(R-n+1))\)的路径的方案数

\[C_{R+B}^R-C_{R+B}^{2R-n+1}

\]

将点\((a,b)\)关于直线\(y=x+T\)对称后的点为\((b-T,a+T)\)

  • \(R=B\)

这时,所有的变色龙都吃了相等数量的红球和蓝球,且最后一个吃的是蓝球,所以这时的颜色序列的最后一个颜色一定为蓝色

所以,若我们去掉颜色序列的最后一个蓝球,就又变成了:\(k-1\)个球,且有\(R>B(R=B+1)\)

所以我们只需要枚举\(R\)即可

复杂度\(O(K)\)

#include<bits/stdc++.h>
using namespace std;
const int MOD=998244353,N=5e5+5;
int n,k,ans;
int jc[N],invf[N];
int power(int x,int y){
int ans=1;
for(;y;y>>=1,x=1ll*x*x%MOD) if(y&1) ans=1ll*ans*x%MOD;
return ans;
}
void Init(){
jc[0]=1;
for(int i=1;i<=k;++i) jc[i]=1ll*jc[i-1]*i%MOD;
invf[k]=power(jc[k],MOD-2);
for(int i=k-1;i>=0;--i) invf[i]=1ll*invf[i+1]*(i+1)%MOD;
}
int C(int n,int m){
if(m>n) return 0;
return 1ll*jc[n]*invf[n-m]%MOD*invf[m]%MOD;
}
int main(){
scanf("%d%d",&n,&k);
if(k<n) return printf("0"),0;
Init();
for(int r=k+1>>1,b;r<=k;++r){
b=k-r;
if(b==r) --b;
ans=(1ll*ans+((1ll*C(r+b,r)-1ll*C(r+b,(r<<1)-n+1))%MOD+MOD)%MOD)%MOD;
}
printf("%d",ans); return 0;
}

AGC021E ball Eat chamelemons的更多相关文章

  1. 「AGC021E」Ball Eat Chameleons

    「AGC021E」Ball Eat Chameleons 考虑如何判定一个合法的颜色序列. 不妨设颜色序列中有 \(R\) 个红球,\(B\) 个蓝球,所以有 \(R+B=k\). 考虑分情况讨论: ...

  2. 【AtCoder】AGC021

    A - Digit Sum 2 从高位到低位数的第i位以前前缀都相同,第i位比当前位上的数小1的情况下,后面都填9 枚举一下然后计算最大的就好 #include <bits/stdc++.h&g ...

  3. AtCoder Grand Contest 021

    A - Digit Sum 2 Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Find t ...

  4. Python100天打卡-Day10-图形用户界面和游戏开发

    基于tkinter模块的GUIPython默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter)使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinte ...

  5. Python-Day07-图形用户界面和游戏开发

    Python-100Day-学习打卡Author: Seven_0507Date: 2019-05-22123 文章目录Python图形用户界面和游戏开发1. tkinter模块2. Pygame进行 ...

  6. Day10 图形用户界面和游戏开发

    基于tkinter模块的GUI GUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述.Python默认的GUI开发模块是tkinter(在Python 3 ...

  7. AtCoder Grand Contest 021完整题解

    提示:如果公式挂了请多刷新几次,MathJex的公式渲染速度并不是那么理想. 总的来说,还是自己太弱了啊.只做了T1,还WA了两发.今天还有一场CodeForces,晚上0点qwq... 题解还是要好 ...

  8. Typescript基础(4)——接口

    前言 今天继续typescript的学习,开始ts接口部分的学习. 接口 接口的理解 首先,我们谈论一下现实生活中的接口.比如生活中常用的插座接口,有些插头是三孔插座的,有些是两孔插座的.插座接口规定 ...

  9. Python100天打卡-Day10

    实现动画效果要实现动画效果,本身的原理也非常简单,就是将不连续的图片连续的播放,只要每秒钟达到了一定的帧数,那么就可以做出比较流畅的动画效果.import pygame def main(): # 初 ...

  10. awsl

    from enum import Enum, uniquefrom math import sqrtfrom random import randint import pygame @uniquecl ...

随机推荐

  1. Delphi 禁止重复运行程序的方法

    第一种方法,使用"过程调用" procedure Del; // 自定义过程 var Mutex: THandle; begin Mutex := CreateMutex(nil, ...

  2. UNIQUE VISION Programming Contest 2025 Spring (AtCoder Beginner Contest 398) (A~F) 补题+题解

    A - Doors in the Center 签到题,直接构造即可. 点击查看代码 #include<bits/stdc++.h> using namespace std; #defin ...

  3. [源码系列:手写spring] IOC第一节:简单bean容器

    本专栏带领大家手写一遍spring的核心代码,包括IOC,AOP,三级缓存... 第一节较为简单,后面的章节会逐渐提升代码量和复杂度,喜欢的同学记得订阅哦  ̄▽ ̄ 定义一个简单的bean容器BeanF ...

  4. IIS7配置301永久重定向

    我把我的小域名www.taadis.com301永久重定向到taadis.com. 关键图解:

  5. TJSON的烦人的泄漏

    System.Json中的JSON应该说还是好用的,因为相关superObject的json使用,转换过来概念思路上有点混淆搞不清. 正题:老是泄漏.一会儿是TJSONArray,一会儿是TJSONO ...

  6. Ruby+Selenium+testunit web自动化demo

    1.安装对应库 使用RubyMine新建项目打开终端安装对应库 gem install selenium-webdriver gem install test-unit 如果安装不成功,请切换到国内源 ...

  7. 【FAQ】HarmonyOS SDK 闭源开放能力 — IAP Kit(6)

    1.问题描述: 支付场景,表现是在沙盒情况下所有商品都可以正常跑通,但是在非沙盒情况下,线上购买年包1800大额支付华为的 iap.createPurchas 在输完密码就会报 1001860001 ...

  8. python实例:导入会员数据后,读取数据文件,检查导入正确性(整列取excel值、合并列、response取值)

    场景描述:某系统新上线,老系统的会员数据要导入新系统中,包含手机号,上级信息和会员余额.有1万多条数据,手工对比过于繁琐,用python自动化处理 思路:系统导入数据后,脚本读取文件,先把会员数据取出 ...

  9. 康谋方案 | BEV感知技术:多相机数据采集与高精度时间同步方案

    随着自动驾驶技术的快速发展,车辆准确感知周围环境的能力变得至关重要.BEV(Bird's-Eye-View,鸟瞰图)感知技术,以其独特的视角和强大的数据处理能力,正成为自动驾驶领域的一大研究热点. 一 ...

  10. AUTOFAC学习DEMO2-——ContainerBuilder注册三种方式、反射注册

    注册组件 通过容器构造器ContainerBuilder注册组件的三种方式: 通过类型反射注册 通过现存实例注册(实现对象的实例) lambda表达式注册(通过可实例化对象的匿名函数注册) 每个组件可 ...