Codeforces Round 925 (Div. 3) G. One-Dimensional Puzzle【推公式+组合数学+隔板法】

原题链接:https://codeforces.com/problemset/problem/1931/G

题目描述:

有 4 种拼图,其中第 i 种拼图有 ci​ 张。

两张拼图可以连结当且仅当它们相邻的卡槽中一个凹陷一个突出。

我们希望将所有的拼图从左往右拼起来,求总方案数。答案对 998244353 取模。

输入输出描述:

多测。1≤t≤2×10^5,0≤ci​≤10^6,∑(c1​+c2​+c3​+c4​)≤4×10^6。

输入输出样例
输入 
11
1 1 1 1
1 2 5 10
4 6 100 200
900000 900000 900000 900000
0 0 0 0
0 0 566 239
1 0 0 0
100 0 100 0
0 0 0 4
5 5 0 2
5 4 0 5
输出 
4
66
0
794100779
1
0
1
0
1
36
126

解题思路:

四种图形的个数分别是c1,c2,c3,c4,首先只考虑第一种图形和第二种图形,如果abs(c1-c2)>1,那么必然多出一个第一种图形或者第二种图形无法插入链中,这个可以自己画图分析一下,这里不做具体描述,然后就是abs(c1-c2)<=1的情况。

当c1==c2时,如下图所示:

对于图形3会有c1种插入位置,图形4会有c2+1中插入位置,此时这个问题就可以转换为了将b个球放进a个盒子有多少种放法了,允许某些盒子为空,我们不妨设为f(a,b),实际上我们可以把这个过程看为将a+b个球放进a个盒子中有多少种放法,此时不允许出现空盒子,这里就相当于在a+b-1个空选择a-1个板子插入,就是C(a+b-1,a-1),对应到这里就是C(c1+c3-1,c1-1)*C(c2+c4,c2),然后如果按照[2,1,2,1,2,1]的方式排列,那么图形3有c1+1插入位置,图形4有c2种插入位置,那么就是C(c1+c3,c1)*C(c2+c4-1,c2-1),这俩种情况加起来即可。

当abs(c1-c2)==1时,如下图所示:

对于c1==c2-1或者c1==c2+1俩种情况,对于图形3和图形4都有max(c1,c2)种插入位置,同上分析,首先不妨设c=max(c1,c2),那么这里就是C(c+c3-1,c-1)*C(c+c4-1,c-1)。

还要注意特判一些边界情况,当c1==c2时,有可能c1==c2==0,那么如果此时c3!=0 && c4!=0,这种情况无法拼出一条链,输出0,也就是在图形1和图形2的个数都是0时,不允许图形3和图形4同时出现。

到这里就分析的差不多了,由于多测数据,我们需要提前预处理组合数,预处理之后,对于每组测试数据直接根据推导出的公式直接输出答案即可。

时间复杂度:O(T+nlog(n)),T表示测试数据组数,n=2e6。

空间复杂度:O(n),n=2e6。

cpp代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;
typedef long long LL;const int N = 2e6 + 10, mod = 998244353;  //注意这里不是模(1e9+7),我开始习惯性写成(1e9+7)导致wa好几发int T;
int fact[N],infact[N];int qmi(int x,int k,int p)
{int res=1;while(k){if(k&1)res=1ll*res*x%p;x=1ll*x*x%p;k>>=1;}return res;
}
void init()  //预处理组合数
{fact[0]=infact[0]=1;for(int i=1;i<N;i++){fact[i]=1ll*fact[i-1]*i%mod;infact[i]=1ll*infact[i-1]*qmi(i,mod-2,mod)%mod;}
}int C(int n,int m)
{if(n<0 || m<0)return 0;return 1ll*fact[n]*infact[m]%mod*infact[n-m]%mod;
}
void solve()
{int c1,c2,c3,c4;cin>>c1>>c2>>c3>>c4;if(abs(c1-c2)>1){ cout<<0<<'\n';return ;}if(c1==c2){if(!c1){  //特判边界情况if(c3 && c4)cout<<0<<'\n';else cout<<1<<'\n';}else {cout<<(1ll*C(c1+c3-1,c1-1)*C(c2+c4,c2)%mod+1ll*C(c1+c3,c1)*C(c2+c4-1,c2-1)%mod)%mod<<'\n';}}else {int c=max(c1,c2);cout<<1ll*C(c+c3-1,c-1)*C(c+c4-1,c-1)%mod<<'\n';}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);init();cin>>T;while(T--){solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师笔记第37期:数据访问层设计

设计高效的数据访问层:优化你的应用性能与可维护性 在软件开发中,数据访问层是连接应用程序和数据库之间的关键组件。一个高效的数据访问层不仅可以提高应用程序的性能,还能增强其可维护性和可扩展性。本文将探讨如何设计一个高效的数据访问层,以优化你的应用程序。 1. 选…

js 中文乱码解决、乱码对照

1、js iso-8859-1转utf-8 在JavaScript中&#xff0c;可以使用内置的TextEncoder和TextDecoderAPI来实现ISO-8859-1编码和UTF-8编码之间的转换。以下是一个将ISO-8859-1编码的字符串转换为UTF-8编码的示例代码&#xff1a; function convertISO88591ToUTF8(isoString) {// 将…

C语言数据结构基础——二叉树学习笔记(二)topk问题

1.top-k问题 1.1思路分析 TOP-K 问题&#xff1a;即求数据结合中前 K 个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大 。 比如&#xff1a;专业前 10 名、世界 500 强、富豪榜、游戏中前 100 的活跃玩家等。 对于 Top-K 问题&#xff0c;能想到的最简单直…

Gradle v8.5 笔记 - 从入门到进阶(基于 Kotlin DSL)

目录 一、前置说明 二、Gradle 启动&#xff01; 2.1、安装 2.2、初始化项目 2.3、gradle 项目目录介绍 2.4、Gradle 项目下载慢&#xff1f;&#xff08;万能解决办法&#xff09; 2.5、Gradle 常用命令 2.6、项目构建流程 2.7、设置文件&#xff08;settings.gradle.…

什么是web组态?Web组态软件哪个好用?

随着工业4.0的到来&#xff0c;物联网、大数据、人工智能等技术的融合应用&#xff0c;使得工业领域正在经历一场深刻的变革。在这个过程中&#xff0c;Web组态技术以其独特的优势&#xff0c;正在逐渐受到越来越多企业的关注和认可。那么&#xff0c;什么是Web组态&#xff1f…

快速从0-1完成聊天室开发——环信ChatroomUIKit功能详解

聊天室是当下泛娱乐社交应用中最经典的玩法&#xff0c;通过调用环信的 IM SDK 接口&#xff0c;可以快速创建聊天室。如果想根据自己业务需求对聊天室应用的 UI界面、弹幕消息、礼物打赏系统等进行自定义设计&#xff0c;最高效的方式则是使用环信的 ChatroomUIKit 。 文档地址…

打开Railway神奇大门:Railway免费注册部署全面教程

&#x1f9d9;‍♂️ 诸位好&#xff0c;吾乃斜杠君&#xff0c;编程界之翘楚&#xff0c;代码之大师。算法如流水&#xff0c;逻辑如棋局。 &#x1f4dc; 吾之笔记&#xff0c;内含诸般技术之秘诀。吾欲以此笔记&#xff0c;传授编程之道&#xff0c;助汝解技术难题。 &#…

JavaScript初学心得

JavaScript JavaScript原名是livescript&#xff0c;是由美国网景开发的一种用于对网页操作的脚本语言 网页操作&#xff08;图片切换&#xff09; 脚本语言&#xff08;不需要编译 sql,html,css,javascript,由某种解释器直接可以运行&#xff09; livescript也是面向对象的…

5.2.3、【AI技术新纪元:Spring AI解码】 Azure OpenAI 扩展

Azure OpenAI 扩展 Azure的OpenAI扩展了OpenAI的功能,提供安全的文本生成和用于各种任务的嵌入式计算模型: 相似性嵌入式非常擅长捕捉两个或多个文本片段之间的语义相似性。 文本搜索嵌入式有助于衡量长文档与短查询的相关性。 代码搜索嵌入式用于嵌入代码片段和嵌入自然…

外键约束

目录 外键约束 对数据表进行初期设计&#xff0c;暂时不使用外键 验证限制三 验证级联删除 设置级联更新 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 外键约束 外键约束主要是在父子表关系中体现的一种约束操作。…

干好工作18法

FROM 微信公众号“泽平宏观”&#xff0c;“泽平宏观” FROM 网络 方法是为达到某种目标而采取的途径、步骤、手段等&#xff0c;是人类认识和改造客观世界的明灯和路标。方法十分重要&#xff0c;方法得当事半功倍&#xff0c;方法失当事倍功半。 方向正确以后&#xff0c;方法…

代码随想录算法训练营day28 | 回溯算法之93.复原IP地址 78.子集 90.子集II

三刷day28 93.复原IP地址判断子串是否合法 78.子集回溯三部曲 90.子集II 93.复原IP地址 题目链接 解题思路&#xff1a; 切割问题就可以使用回溯搜索法把所有可能性搜出来 回溯三部曲 递归参数 startIndex一定是需要的&#xff0c;因为不能重复分割&#xff0c;记录下一层递…

windows取证

Windows事件日志分析 使用Windows事件日志查看器&#xff0c;打开实验文档“security01.evtx”。按“日期和时间”对日志进行分组统计&#xff1b;按“事件ID”对日志进行分组统计&#xff1a; 问题&#xff1a;日志中是否有用户登录失败的记录。如果有&#xff0c;请按“登录…

AI智能客服的数据训练流程

实现智能客服的数据训练流程可以分为几个主要步骤&#xff0c;包括数据准备、模型选择、模型训练和评估。以下是一个基本的数据训练流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.数据准备&am…

1-postgresql数据库高可用脚本详解

问题&#xff1a; pgrep -f postgres > /dev/null && echo 0 || pkill keepalived 这是什么意思 建议换成 pgrep -f postmaster > /dev/null && echo 0 || pkill keepalived 回答 这条命令是一个复合命令&#xff0c;包含条件执行和重定向的元素。让我们…

Java简介与历史

Java的故事&#xff1a;一次从咖啡到全球舞台的编程之旅 你知道吗&#xff1f;有一门编程语言的名字来源于世界上著名的咖啡产地——爪哇岛。没错&#xff0c;这就是我们今天要聊的主角——Java编程语言&#xff0c;它的诞生和发展历程充满了创新与传奇色彩。 Java的诞生&…

三、转移字符、字符串、bool类型和eval函数

一、转义字符 \n&#xff1a;换行符 \t&#xff1a;制表符 \&#xff1a;单引号 \"&#xff1a;双引号 \\&#xff1a;反斜杠 a人生无常 b我用python print(ab) print(f"{a}\n{b}") print(f"{a}\t{b}") print(fr"{a}\t{b}") 在打印字…

@Lazy注解解决循环依赖和三级缓存的区别

Spring三级缓存解决了哪些循环依赖 1.1 属性-属性 Service public class InstanceA {Autowiredprivate InstanceC InstanceC; }Service public class InstanceC {Autowiredprivate InstanceA InstanceA; } 1.2 先属性-后构造函数 // 解释&#xff1a;就在是创建bean的时候…

const,static深度总结——c++穿透式分析

前言&#xff1b;c类和对象的知识点中除了几种默认函数&#xff0c; 比较重要的还有使用const和static修饰成员相关知识点。const在c中特性很简单。 但是在使用中&#xff0c; 比较容易疏忽大意出现问题。 static特性也很简单&#xff0c; 但是比起const来要直接的多。 在使用中…

LAMP架构部署--yum安装方式

这里写目录标题 LAMP架构部署web服务器工作流程web工作流程 yum安装方式安装软件包配置apache启用代理模块 配置虚拟主机配置php验证 LAMP架构部署 web服务器工作流程 web服务器的资源分为两种&#xff0c;静态资源和动态资源 静态资源就是指静态内容&#xff0c;客户端从服…