CF1237F Balanced Domino Placements(dp+组合计数)

CF1237F Balanced Domino Placements

  • problem
  • solution
  • code

problem

题目链接

solution

骨牌横着放会占用一行两列,骨牌竖着放会占用两行一列。

问题可以抽象为:每次可以选择连续的两行放 AAA,或选一行放 BBB;每次可以选一列放 BBB ,或选连续的两列放 AAA

且最后行的 AAA 数量等于列的 BBB 数量,列的 AAA 数量等于行的 BBB 数量。【多米诺骨牌大小的匹配】

这样一个放物品的过程会对应原来很多个多米诺骨牌摆放的方案,因为行列之间 A,BA,BA,B 配对的方案不只一种,任意一种配对方案对应一种不同的摆放方案。

行列之间的 A,BA,BA,B 的摆放是不影响的,只有数量相等的要求。

假设选了 xxxAAAyyyBBB,则方案数为 x!y!x!y!x!y!

由于行列互不影响,所以分开求解,最后利用乘法原理计算即可。下面以行为例。

dpi,j,k:dp_{i,j,k}:dpi,j,k: 考虑前 iii 行,放了 jjjAAAkkkBBB 的方案数。

暴力的状态都是 n3n^3n3 的,考虑优化。
实际上,BBB 的性质是只占用一行,只要知道剩下的空位,我们就能计算 BBB 的方案数。

改写 dpi,j:dp_{i,j}:dpi,j:iii 行放了 jjjAAA ,还没有放 BBB 的方案数。

那么最后可以放 BBB 的空位为 cnt−2∗jcnt-2*jcnt2jcnt:cnt:cnt: 去除掉题目所给多米诺骨牌占用的行后剩下的行数,如果要选 kkkBBB,则可以 O(1)O(1)O(1) 计算方案数为:(cnt−2∗jk)\binom{cnt-2*j}{k}(kcnt2j)

最后合并需要枚举行选了多少个 AAA 和多少个 BBB,枚举总时间也是 O(n2)O(n^2)O(n2) 的。

所以本题最终的时间复杂度为:O(n2)O(n^2)O(n2)

code

#include <cstdio>
#define int long long
#define mod 998244353
#define maxn 3605
int n, m, k, cnt_c, cnt_r;
int fac[maxn];
bool row[maxn], col[maxn];
int c[maxn][maxn], f[maxn][maxn], g[maxn][maxn];signed main() {scanf( "%lld %lld %lld", &n, &m, &k );cnt_r = n, cnt_c = m;for( int i = 1, X1, Y1, X2, Y2;i <= k;i ++ ) {scanf( "%lld %lld %lld %lld", &X1, &Y1, &X2, &Y2 );row[X1] = row[X2] = col[Y1] = col[Y2] = 1;cnt_r --, cnt_c --;if( X1 ^ X2 ) cnt_r --;else cnt_c --;}fac[0] = f[0][0] = g[0][0] = c[0][0] = 1;for( int i = 1;i < maxn;i ++ ) fac[i] = fac[i - 1] * i % mod;for( int i = 1;i < maxn;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ )c[i][j] = ( c[i - 1][j] + c[i - 1][j - 1] ) % mod;}for( int i = 1;i <= n;i ++ )for( int j = 0;j <= i / 2;j ++ ) {f[i][j] = f[i - 1][j];if( i >= 2 and j and ! row[i] and ! row[i - 1] ) f[i][j] = ( f[i][j] + f[i - 2][j - 1] ) % mod;}for( int i = 1;i <= m;i ++ )for( int j = 0;j <= i / 2;j ++ ) {g[i][j] = g[i - 1][j];if( i >= 2 and j and ! col[i] and ! col[i - 1] ) g[i][j] = ( g[i][j] + g[i - 2][j - 1] ) % mod;}int ans = 0;for( int i = 0;i <= cnt_r / 2;i ++ )for( int j = 0;j <= cnt_c / 2;j ++ )if( i * 2 + j <= cnt_r and i + j * 2 <= cnt_c )ans = ( ans + f[n][i] * g[m][j] % mod * c[cnt_r - 2 * i][j] % mod * c[cnt_c - 2 * j][i] % mod * fac[i] % mod * fac[j] ) % mod;printf( "%lld\n", ans );return 0;
}

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

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

相关文章

AcWing 201. 可见的点

AcWing 201. 可见的点 题意&#xff1a; 题解&#xff1a; 我们先说结论:坐标(i,j)&#xff0c;如果i和j互质&#xff0c;说明该坐标为可见 为什么&#xff1f; 我们想想什么样的坐标可见&#xff0c;什么样的会被挡住。光线是一个直线&#xff0c;在同一个直线上的点会被第一…

模板:LGV引理(线性代数)

所谓LGV引理&#xff0c;就是解决LGV问题的引理。 &#xff08;逃&#xff09; 前言 上联&#xff1a;古有学完SAM学PAM&#xff1b; 下联&#xff1a;今有学完Polya学LGV&#xff1b; 横批&#xff1a;小清新。 常被用于有向图不交路径计数问题。&#xff08;废话&#xff…

ocelot 自定义认证和授权

Intro最近又重新启动了网关项目&#xff0c;服务越来越多&#xff0c;每个服务都有一个地址&#xff0c;这无论是对于前端还是后端开发调试都是比较麻烦的&#xff0c;前端需要定义很多 baseUrl&#xff0c;而后端需要没有代码调试的时候需要对每个服务的地址都收藏着或者记在哪…

CF765F Souvenirs(势能线段树)

CF765F Souvenirsproblemsolutioncodeproblem 题目链接 solution 这个势能线段树简直是太巧妙了&#xff01;&#xff01;&#xff01;( ఠൠఠ )&#xff89; 将询问按右端点升序离线下来。 对于每一个右端点 rrr&#xff0c;维护 ansimin⁡{∣ai−aj∣,j∈[i,r]}ans_i\m…

P4849 寻找宝藏(模板:四维偏序)

stable_sort 保平安。 解析 dp方程显而易见&#xff0c;关键就是如何进行这个四维偏序的转移。 考虑三维偏序&#xff08;比如拦截导弹&#xff09;我们是如何做的&#xff1f; 先按照第一维排序&#xff0c;然后分治解决前一半&#xff0c;接下来把前一半的第一维看成0&…

AcWing 220. 最大公约数

AcWing 220. 最大公约数 题意&#xff1a; 题解&#xff1a; 题目就变成了AcWing 201. 可见的点 当然有微调&#xff0c;因为可见的点里面是从0开始&#xff0c;本题从1开始&#xff0c;所以本题中phi[1]认为是0 AcWing 201. 可见的点的题解 代码&#xff1a; #include<b…

2021 CSP-S 游记

2021CSP-S游记 从国庆过后就开始停课&#xff0c;确实面对的压力和挑战很大。 这段时间真的就是完全没有去想文化课那边的事。 越接近考试时间&#xff0c;模拟赛就越密集&#xff0c;最近大家都在互测。 蛮清楚自己的水平的&#xff0c;而且偶尔还是能考得不错&#xff0c…

欧拉函数(简单介绍+例题)

Acwing视频讲解 欧拉函数&#xff1a;正整数n&#xff0c;欧拉函数是小于n的正整数中与n互质的数的数目 Np1a1 * p1a2 * p1a3 * …* p1ak 如果pj是i的最小质因子 红色区域一样 经推导得&#xff1a;phi[i * pj] phi[i] * pj 如果pj不是i的最小质因子 经推导&#xff1a;phi[…

P5303 [GXOI/GZOI2019]逼死强迫症(斐波拉契、矩阵乘法)

解析 非常妙的一个题&#xff0c;感受到了斐波拉契优美的归纳性质。 首先&#xff0c;不难发现只要两个1*1的位置固定&#xff0c;中间的摆法就固定了&#xff0c;而两边的方案都是经典的斐波拉契数列&#xff08;设为 fif_ifi​&#xff09;。 那么枚举中间的间隔再枚举左边…

程序员过关斩将--你的面向接口编程一定对吗?

菜菜哥&#xff0c;出大事啦怎么了&#xff0c;你和男票分手了&#xff1f;很正常&#xff0c;谁让你男票是产经经理呢不是啦&#xff0c;是我做的一个小游戏&#xff0c;需求又变了&#xff0c;程序我快改不动了说来让我欢乐一下&#xff1f;菜菜哥&#xff0c;咱两还能不能好…

[2021 CSP-S提高组] 题解(廊桥分配+括号序列+回文+交通规划)

2021 CSP-S 题解廊桥分配括号序列回文交通规划配合&#x1f449;CSP-S游记 食用更佳哦~ 【雷】&#xff1a;只是在民间数据过了&#xff0c;不保证一定正确。仅供参考&#xff01;&#xff01;&#xff01; 【雷】&#xff1a;只是在民间数据过了&#xff0c;不保证一定正确。…

P1247 取火柴游戏

P1247 取火柴游戏 题意&#xff1a; 有n堆火柴&#xff0c;两个人轮流操作&#xff0c;每次只能在从一堆中取若干火柴&#xff0c;拿走最后一根火柴的为胜者&#xff0c;给你一个状态&#xff0c;问先手是赢是输 题解&#xff1a; 很经典的nim博弈&#xff0c;结论大家应该…

Codeforces:779(div2)

前言 solve 4 rnk247 占了罚时的便宜。 CF不占罚时便宜就会被罚时占便宜 感觉这场似乎都是性质题&#xff0c;一眼看出性质就秒了&#xff0c;看不出就很难做出来了。 C似乎卡了很多人。但我做起来还好。 D2做不出来有些懊恼。 E是妙题。 题目 A 水题&#xff0c;保证male…

我们为什么要搞长沙.NET技术社区(4)

我们为什么要搞长沙.NET技术社区&#xff08;4&#xff09;邹溪源&#xff0c;2019年3月7日Ps:文中的.NET 包括且不限定于传统.NET Framework技术和.NET Core技术。1. 楔子昨天&#xff08;2019年3月6日&#xff09;晚餐时间&#xff0c;有幸得到长沙技术圈资深.NET开发者出生…

P1290 欧几里德的游戏

P1290 欧几里德的游戏 题意&#xff1a; 给定两个正整数 M 和 N&#xff0c;从 Stan 开始&#xff0c;从其中较大的一个数&#xff0c;减去较小的数的正整数倍&#xff0c;当然&#xff0c;得到的数不能小于 0。然后是 Ollie进行同样的操作&#xff0c;直到一个人得到0&#…

【无码专区3】乘法表的解密破译

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 problem 给定一个 qqq 进制的乘法表&#xff0c;每个字符代表着 0∼p−10\sim p-10∼p−1 不同的数字。 求每个字符代表的数字。保证有解。 \timesABCDACDBBDCBABBBBBBBBBCDCBBDBBCDBABBBCBD i.e. CD\text{C…

CF1553H XOR and Distance (Trie)

解析 有的时候&#xff0c;看起来是暴力的东西再稍微想想性质就是正解了。 本题有两种做法&#xff0c;一种使用了trie树&#xff0c;一种没有。但本质是一样的&#xff0c;只是trie树把我们的所求显性的表达了出来。 考虑trie树暴力怎么做。 对于一个特定的 xxx 走到一个结…

C#机器学习之判断日报是否合格

原文作者&#xff1a;心莱科技肖鑫简单来说机器学习的核心步骤在于“获取学习数据&#xff1b;选择机器算法&#xff1b;定型模型&#xff1b;评估模型&#xff0c;预测模型结果”&#xff0c;下面本人就以判断日报内容是否合格为例为大家简单的阐述一下C#的机器学习。第一步&a…

【无码专区4】幸运数字4(折半搜索+计数+结论)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

P1288 取数游戏II

P1288 取数游戏II 题意&#xff1a; 一个环&#xff0c;由边权&#xff0c;硬币一开始在一个点上&#xff0c;两个人轮流操作&#xff0c;每次操作向左或右移动&#xff0c;每次移动必须将边权减少到非负整数&#xff0c;如果原本是0则不能走&#xff0c;当不能走动时&#x…