首页 > 其他分享 >Luogu P8594

Luogu P8594

时间:2023-10-15 14:24:39浏览次数:42  
标签:begin end Luogu sum P8594 times pmatrix 2j

Luogu P8594 Solution

【形式化题意】

你有 \(1\times x\)(\(x\) 为任意正整数)的矩形各无穷多个和一个 \(2\times n\) 的网格,请求出恰好选择其中 \(k\) 个矩形(可以选择相同的矩形)不重不漏地铺满整个网格的方案数。矩形可以旋转。

\(n\leq 2\times 10^7,k\leq 5000\)

【解答】

评价:一道很不错的组合计数题,要运用许多技巧才能解决。

因为 \(k\leq 5000\),所以我们可以尝试用 \(O(k^2)\) 的算法来解决这个问题。

首先确定我们要计算什么,定义状态是在有 \(i\) 个 \(1\times 2\) 的长方形竖着的,且将整个长条分成了 \(j\) 段的情况下的种类数。(并且,我们强制要求这 \(j\) 段中的每一段都是由横着的长方形填充的)

114514

感性理解一下,这个是 \(i=3,j=3\) 的其中一种情况。而这些 \(2\times2, 1\times 2,4\times 2\) 的子矩阵都应该由横着的长方形来填充。

计算出这个子问题的答案,我们要分步解决。

问题一、这 \(i\) 个 \(1\times2\) 的竖着的长方形怎么放(确定这 \(i\) 个竖着的位置)

我们使用插空法。 设当前已经放好了这 \(i\) 个竖着的长方形,那么就是这 \(j\) 个段去选 \(i+1\) 个空(两端的空是允许使用的),所以这个问题就迎刃而解了。

那么显然是 \(\begin{pmatrix} i+1\\ j \end{pmatrix}\) 种。(\(i+1\ge j\))

问题二、这 \(j\) 段的每一段怎么分配,也就是说每一段有多少列。

我们使用 插板法。 现在剩下了 \(n-i\) 列没有分配(\(n\) 列减去已经使用的竖着的 \(i\) 个),要分给 \(j\) 段,每一段不能为空。那么它就是有 \(n-i-1\) 个空,要插入 \(j-1\) 个板子。(因为不能为空,所以两端的空不能使用。)

那么就是 \(\begin{pmatrix} n-i-1\\ j-1 \end{pmatrix}\) 种。(\(n-i\ge j\))

问题三、这 \(j\) 段的内部怎么分配

引理:对于一个 \(2\times n\) 的长方形,若有 \(x\) 个 \(1\times l\) 的长方形来填充,并且不允许竖着放,则有 \(\begin{pmatrix} 2n-2\\ x-2 \end{pmatrix}\) 种。

对于这个引理的解释:显然我们也可以用插板法。你可以看成 \(1\times (2\times n)\) 的长方形,因为他分成了两列,所以我们可以认为正中间的那个空天然地就放了一块板子。

于是,还剩下 \(2n-2\) 个空,还有 \(x-2\) 块板子要放(原有 \(2n-1\) 个空与 \(x-1\) 个板子,两个都确定了一个中间的)。

回到问题三原本的问题,我们不能一个一个地去考虑,要整体去考虑。(其实这就是范德蒙德卷积的思想。)

一共有 \(j\) 个段,设第 \(p\) 段要有 \(c_p\) 个横着的长方形来填充,其为 \(2\times d_p\) 的长方形,那么答案就是:

\(\sum_{c,d}\prod_{p=1}^{j}\begin{pmatrix} 2d_l-2\\c_l-2\end{pmatrix}\)

这样来求时间复杂度直接就爆了。但是我们要运用整体的思想。 一共有 \(\sum (2c_p-2)\) 个空,一共要插入 \(\sum (d_p-2)\) 块板子。答案就是
\(\begin{pmatrix} \sum (2c_p-2)\\ \sum (d_p-2) \end{pmatrix}\)

显然我们可以直接化简 \(\sum (2c_p-2)\) 和 \(\sum (d_p-2)\),其分别为 \(2n-2i-2j\) 和 \(k-i-2j\)。(\(k\) 就是原题面里的,\(i\) 表示用了 \(i\) 个 \(1\times 2\) 的竖着的)

于是问题三的答案就是 \(\begin{pmatrix} 2n-2i-2j\\ k-i-2j \end{pmatrix}\)。实际上,这些在做的是在运用范德蒙德卷积

对于范德蒙德卷积,这里就不做解释了。

【统计答案】

有了问题一,二,三的计算公式,我们可以直接推导出在有 \(i\) 个 \(1\times 2\) 的长方形竖着的,且将整个长条分成了 \(j\) 段的情况下的种类数,就是三个问题的公式相乘。

给定 \(i,j\),其种类数为 \(\begin{pmatrix} 2n-2i-2j\\ k-i-2j \end{pmatrix}\begin{pmatrix} n-i-1\\ j-1 \end{pmatrix}\begin{pmatrix} i+1\\ j \end{pmatrix}\)。

直接去枚举 \(i\) 和 \(j\) 就可以了,因此,所有的答案是:

\(\sum_{i=0}^{k}\sum_{j=0}^{k}\begin{pmatrix} 2n-2i-2j\\ k-i-2j \end{pmatrix}\begin{pmatrix} n-i-1\\ j-1 \end{pmatrix}\begin{pmatrix} i+1\\ j \end{pmatrix}\)。

【代码细节】

由于 \(n\leq 2\times 10^7\),所以要线性预处理逆元。这样可以 \(O(1)\) 求组合数。

这题卡空间,阶乘和逆元数组不要用 long long

具体代码就不贴了,不难。

标签:begin,end,Luogu,sum,P8594,times,pmatrix,2j
From: https://www.cnblogs.com/nullptr-qwq/p/17765572.html

相关文章

  • [刷题笔记] Luogu P5658 [CSP-S 2019] 括号树
    Description给定一棵树,树的每个节点都有一个左括号或者右括号,求从根节点到每个点简单路径上的括号序列上合法的子括号序列数。Analysis显然树形dp。考虑如何设计状态,定义\(f_i\)表示从root到\(i\)节点的字串合法数量。考虑转移,如果当前的括号为左括号,我们无法和前面的......
  • 传纸条 luoguP1006
    题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊......
  • Luogu CF1174C 题解
    这道题其实不难。\(\gcd(i,j)=1\),其实就是\(i\)与\(j\)互质。如果\(i\)与\(j\)不互质,那么我们一定要让\(a_i\)与\(a_j\)相同,只有这样,才能使\(a\)序列中的最大值最小化。所以,我们可以使用埃氏筛法,当筛到质数时,给它和它的倍数都赋值为一个新数。ACCode:#include......
  • Luogu P8651 题解
    这是让我最崩溃的一道橙题了。整整11次提交才AC。这道题有几个要点必须注意:判断日期是否合理。按顺序输出。判断重复的日期。首先,我们来看怎么判断日期是否合理。我们知道大月有\(31\)天,小月有\(30\)天,二月看平年闰年。所以,我们可以写出这样的代码:boolc......
  • Luogu CF1469B 题解
    这道题其实并不难。题目大意是这样的:已知两个序列\(r\)和\(b\),求出合并后的最大前缀和。很好发现:答案就是\(r\)和\(b\)各自的最大前缀和之和。但要注意:\(r\)和\(b\)可以什么都不取,因此\(maxa\)和\(maxb\)初始要赋值为\(0\)。ACCode:#include<iostream>using......
  • Luogu CF755B 题解
    这题其实不难。两人最佳的方案就是先说对方会的词。不难证明,设先手会说\(n\)个单词,后手会说\(m\)个单词,若\(n>m\),则先手胜,若\(n<m\),则后手胜。那如果\(n=m\)呢?假设两人都会说的单词数为\(k\),那么一番推理发现,当两人说了\(k-1\)次,就没有两人都会的词了,可以回到之......
  • Luogu CF1133B 题解
    这道题其实很简单要让两数和为\(k\)的倍数,需要满足以下两条件之一:两数都是\(k\)的倍数两数的余数和为\(k\)因此,我们可以先统计出余数再按上述条件算出共有多少组,即可得到答案注意:当\(k\)为偶数时,余数为\(k/2\)的数要两两配对,不要多算这里统计的是组数,......
  • Luogu P7627 题解
    这题其实不难但如果用暴力,肯定过不了所以我们得想另一种办法我们发现,只有\(1\)异或\(0\)的值为\(1\)例如:\(1\),\(0\),\(1\)两两异或的和为2其实就是每个\(0\)与每一个\(1\)异或时,\(sum\)要加\(1\)所以,我们只要把每一位的\(0\)和\(1\)的数量都统计出来......
  • Luogu CF400C 题解
    这道题其实不难,只是一道非常简单的模拟题。我们发现,每顺时针转动\(4\)次、镜面对称\(2\)次、逆时针旋转\(4\)次,就变回原来的样子了。所以,在操作前,我们可以让\(x\getsx\bmod4\),\(y\getsy\bmod2\),\(z\getsz\bmod4\)。接下来,只需在草稿纸上画一画,即可知道顺时针转一次,一......
  • Luogu 300 粉粉福
    由于第二张图片是分期制作的,所以两次爬头像时,粉丝列表顺序可能会有微小的变动(比如取关会让后面的人往前一位),这就导致了有极少数粉丝被漏掉了。在此,我对大家道歉所有粉丝头像第一张图是动图,第二张图是一个\(1600\times1800\)的图片第一张图片加载可能比较慢封禁用户不在图片......