第十届集美大学程序设计竞赛正式赛 C题 方格染色 题解

news2024/10/7 10:15:56

前言

  • 记录一下,给自己长长记性,刚看到题目立马想出了一个 O ( T ∗ n k ) O(T*nk) O(Tnk)的暴力DP,想着构造个矩阵用快速幂优化为 O ( ∑ 1 T k ∗ l o g ( n ) ) O(\sum_1^T{k}*log(n)) O(1Tklog(n)),结果构造一个小时发现貌似不太行,想假了,悲(
  • 赛后做其他组合数的题突然想到这个题貌似也可以用组合数做,然后很快的就切了,以此题解铭记我坐了 3h 的牢
  • 本题解只提供思路讲解和核心代码,其余代码需要自己实现

正文

  • 题目链接

方格染色

小 M 正在处理染色问题!问题发生在一个由 2 × n 个 1 × 1 的小正方形方格组成的矩形纸条上,小 M 想要把矩形纸条的每个方格染成黑色或是白色。 但由于小 M 的视力不太好,若相邻两个方格都是黑色,小 M 会非常困惑。因此。他希望最后染色方 案中任意两个黑色方格均不相邻。同时,他还想知道在黑色方格恰好有 k 个的情况下,求出满足上述条 件的染色方案数对 998244353 取模的结果?

多测, T ≤ 1 0 5 , 1 ≤ n ≤ 1 0 5 , 0 ≤ k ≤ 1 0 5 T \le 10^5,1\le n \le 10^5,0 \le k \le 10^5 T1051n1050k105,保证 ∑ k ≤ 5 ∗ 1 0 5 \sum{k} \le 5 * 10^5 k5105

思路讲解

  • 用组合数做这个题,首先需要发现一个性质,如果我们把每一列看作是一个单独的整体
  • 定义:我们把相邻列有黑色块的列看作是一个块 \color{Orange}定义:我们把相邻列有黑色块的列看作是一个块 定义:我们把相邻列有黑色块的列看作是一个块
  • 那么这一个块内的不同摆放只有两种

在这里插入图片描述

  • 发现这个性质后,我们可以考虑枚举一共有多少个块,然后把这些块拿出来,现在还剩n-k列,我们需要做的就是把这些块插到这n-k列中,然后形成的方案数就是答案了

  • 那么怎么求方案数呢,这里先给出公式 ∑ d = 1 k C ( k − 1 , d − 1 ) ∗ C ( n − k + 1 , d ) ∗ 2 d \sum_{d=1}^k C(k-1,d-1)*C(n-k+1,d)*2^d d=1kC(k1,d1)C(nk+1,d)2d

  • 这个公式是怎么推出来的呢?

  • 首先我们枚举n列方格一共有多少的块,然后怎么求这些块形成的方案数呢,对于块数d,我们要做的就是把k列分成d个块,采用隔板法,即:现在有k个小球,你要在k个小球的之间放置d-1个隔板,使得分成d个非空集合,由于k个小球的缝的个数是k-1个(两边不可以插入),那么形成的方案应该是 C ( k − 1 , d − 1 ) C(k-1,d-1) C(k1,d1)

  • 由于每个块是不能相邻的(否则他们应该是一个块),现在需要把形成的d个块插入到原来的白色列的缝隙里,白色列的个数是n-k,那么缝数是n-k+1(两边可以插入),那么方案数就是 C ( n − k + 1 , d ) C(n-k+1,d) C(nk+1,d)

  • 对于每个块有两种摆放方式,那么d个块有 2 d 2^d 2d 种摆放方式

  • 之后我们只需要把不同的d的方案数累计起来即可,在不考虑取模的情况下时间复杂度为 O ( ∑ 1 T k ) O(\sum_1^T k) O(1Tk)

Code

void solve(int Case) {
    int n, k;
    cin >> n >> k;
    if (k == 0) {  // 只有什么都不放一种方案
        cout << "1\n";
        return;
    }
    if (n < k) {  // k太大,放不下
        cout << "0\n";
        return;
    }

    modint ans = 0;
    for (int d = 1; d <= k; d++) {
        ans += C(k - 1, d - 1) * C(n - k + 1, d) * modint(2).pow(d);
    }
    cout << ans << "\n";
}

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

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

相关文章

单目标应用:红尾鹰算法(Red‑tailed hawk algorithm ,RTH)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、红尾鹰算法RTH 红尾鹰算法&#xff08;Red‑tailed hawk algorithm &#xff0c;RTH&#xff09;由Seydali Ferahtia等人于2023年提出&#xff0c;该算法…

医院等级评审,离不开不良事件报告系统

不良事件上报系统源码 不良事件管理系统源码 不良事件上报系统是医院等级评审、评价、监督、保障和提高医疗服务质量的重要举措&#xff0c;它作为促进医疗质量持续改进的有效手段&#xff0c;受到越来越多医院的高度重视。在卫生部三级综合医院评审标准实施细则3.9.1明确要求&…

【Linux】第六站:Centos系统如何安装软件?

文章目录 1.Linux安装软件的方式2.Linux的软件生态3. yum4. rzsz软件的安装与卸载5.yum如何知道去哪里下载软件&#xff1f; 1.Linux安装软件的方式 在linux中安装软件常用的有三种方式 源代码安装&#xff08;我们还需要进行编译运行后才可以&#xff0c;很麻烦&#xff09; …

STM32-DAC

DAC 数字/模拟转换模块&#xff0c;把输入的数字编码转换成对应的模拟电压输出。 在常见的数字信号系统中&#xff0c;大部分传感器信号被转化成电压信号&#xff0c;而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码&#xff0c;由计算机处理完成后再由DAC输出电压模…

干货!数字IC后端入门学习笔记

很多同学想要了解IC后端&#xff0c;今天大家分享了数字IC后端的学习入门笔记&#xff0c;供大家学习参考。 很多人对于后端设计的概念比较模糊&#xff0c;需要做什么也都不甚清楚。 有的同学认为就是跑跑 flow、掌握各类工具。 事实上&#xff0c;后端设计的工作远不止于此。…

通过Metasploit+Ngrok穿透内网长期维持访问外网Android设备

前言: 因为之前作为小白我不会在Kali Linux里面把IP映射出外网&#xff0c;卡在那个地方很久&#xff0c;后来解决了这个问题就写方法出来和大家分享分享。 环境&#xff1a; Kali Linux系统(https://www.kali.org/downloads/) Metasploit Ngrok Linux64位的端口转发工具(htt…

NeurIPS 2023 | FedFed:特征蒸馏应对联邦学习中的数据异构

在本文中&#xff0c;我们提出了一种新的即插即用的联邦学习模块&#xff0c;FedFed&#xff0c;其能够以特征蒸馏的方式来解决联邦场景下的数据异构问题。FedFed首次探索了对数据中部分特征的提取与分享&#xff0c;大量的实验显示&#xff0c;FedFed能够显著地提升联邦学习在…

【Java】多线程案例(单例模式,阻塞队列)

> :heart: Author&#xff1a; 老九☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 实现安全版本的单例模式饿汉模式类和对象的概念类对象类的静态成员与实例成员 懒汉模…

【高效写作技巧】CSDN的原力等级有什么用?如何增长原力等级?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《写作技巧》 《C嘎嘎干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;hello&#xff01; 各位铁铁们大家好啊&#xff0c;这段时间接触了一些刚开始写作的新人…

RPA机器人与传统自动化解决方案的差异性

当前&#xff0c;数字化转型是大势所趋&#xff0c;不少企业在应用传统自动化改造时&#xff0c;由于受到资金、技术、冗杂的流程或者系统集成的限制&#xff0c;投入产出比不甚理想。随着新技术和自动化的升级发展&#xff0c;RPA数字员工为企业数字化转型提供了一套更加简单高…

公众号排版技巧有哪些方面?纯干货

一个精心排版的公众号&#xff0c;能够让读者在阅读过程中感受到舒适与愉悦&#xff0c;同时也能够帮助读者更好地理解文章内容&#xff0c;突出重点&#xff0c;提高阅读效率。 一个专业性的公众号&#xff0c;不仅要有深度的内容&#xff0c;也需要有专业的排版&#xff0c;…

GE IS420UCSBH1A 控制器模块

控制器模块是工业自动化和控制系统中的关键组件&#xff0c;用于监测、控制和管理各种工程过程。这些模块通常具有以下特点&#xff1a; 多通道控制&#xff1a; 控制器模块通常可以控制多个通道&#xff0c;允许同时管理多个设备或过程。 实时控制&#xff1a; 模块支持实时控…

不直播拍视频,一样可以变现,原来是做了这个!

我是电商珠珠 随着直播带货的流行&#xff0c;部分大学也开始紧随其后&#xff0c;相继增设网络营销与直播电商这项课程。 以上这些技能&#xff0c;部分人并不知道怎么搞&#xff0c;一是不想麻烦&#xff0c;没那么多时间精力&#xff0c;二是做不起来&#xff0c;自身没有那…

本地maven批量导入nexus maven仓库中

1、在本地的maven仓库中创建两个脚本 mavenimport.sh里边的内容是&#xff1a; #!/bin/bash # copy and run this script to the root of the repository directory containing files # this script attempts to exclude uploading itself explicitly so the script name is im…

frp内网穿透教程搭建0.52.3版本

网上很多关于frp的教程都是04 03版本的了&#xff0c;都是配置的ini文件&#xff0c;现在都改成toml文件了&#xff0c;下面基本上都是官方文档的简单copy&#xff0c;细节推荐打开去看中文版的文档介绍&#xff08;地址放在最后了&#xff09;。下面简单介绍几个 为什么使用 …

中文互联网正在死去,未来在哪

每次浏览网页的时候&#xff0c;发现优质内容越来越少&#xff0c;大部分的优质内容都是5年之前的。笔者认为2008-2015年是中文互联网最优质的阶段。 尤其是搞IT的&#xff0c;总去网上搜索一些技术难题或者技术文章&#xff0c;现如今发现越来越难&#xff0c;无论是csdn、cnb…

GE IS215VCMIH2CA IS200VCMIH2CAA涡轮燃机模块

涡轮焚机模块是一种用于航空、动力和产业运用的症结装备&#xff0c;具备独特的特征&#xff0c;以餍足高效力、低温、低压的歇息情况。以下是涡轮焚机模块的一些主要特征&#xff1a; 高效力&#xff1a; 涡轮焚机模块通常具备高效的能量变换才能&#xff0c;将焚料焚烧打消的…

上网行为管理软件有哪些丨功能图文超详细介绍

很多人都在后台问&#xff0c;上网行为管理软件到底是什么&#xff0c;有什么作用&#xff0c;今天就重点给大家讲解一下&#xff1a; 是什么 上网行为管理软件可以帮助企业规范员工的上网行为&#xff0c;提高办公效率&#xff0c;减少潜在威胁。 有哪些 在市面上&#xff…

双十一数码好物推荐,这几件入手绝对不吃灰

又到了一年一度的“双十一”购物狂欢季&#xff0c;大家是否已经找到心仪的物品呢&#xff1f;平时我们看中的某个商品&#xff0c;总是希望在最低价时购买&#xff0c;而毫无疑问&#xff0c;双十一是最佳的时机&#xff0c;毕竟各大电商平台都会推出丰富的优惠活动。为此&…

什么是接口测试?如何进行接口测试?

接口测试是一种常见的软件测试方法&#xff0c;用于测试软件系统中不同模块之间的接口。 接口是指两个或多个独立软件模块之间进行数据交换的地方。在软件系统中&#xff0c;不同的模块之间相互依赖和交互&#xff0c;这些模块通过接口来实现数据的传递和共享。因此&#xff0…