P10681 [COTS 2024] 奇偶矩阵 Tablica

news/2025/1/10 15:01:57/文章来源:https://www.cnblogs.com/liyixin0514/p/18660665

P10681 [COTS 2024] 奇偶矩阵 Tablica

题意

有一个 \(n \times m\)\(01\) 矩阵,问有多少种填 \(01\) 的方式,满足同一行、列恰好有 \(1\)\(2\)\(1\)

\(n,m \le 3000\)

思路

首先一个显然的 \(O(nm^2)\) 做法:

\(f_{i,s0,s1}\) 表示考虑到第 \(i\) 行,目前有 \(s0\) 列有 \(0\)\(1\),有 \(s1\) 列有 \(1\)\(1\),的方案数。

转移分 \(5\) 种,讨论第 \(i+1\) 行填几个 \(1\),以及在 \(s0\) 还是 \(s1\) 那里选 \(1\)

就是酱子:

int w = f[i][s0][s1];
if (s0)_add(f[i + 1][s0 - 1][s1 + 1], mul(s0, w)),_add(f[i + 1][s0 - 1][s1], mul(w, mul(s0, s1)));
if (s1)_add(f[i + 1][s0][s1 - 1], mul(s1, w));
if (s0 >= 2)_add(f[i + 1][s0 - 2][s1 + 2], mul(w, 1ll * s0 * (s0 - 1) / 2 % mod));
if (s1 >= 2)_add(f[i + 1][s0][s1 - 2], mul(w, 1ll * s1 * (s1 - 1) / 2 % mod));

好像 DP 状态不好再减了。

所以考虑不要一行行转移了,直接组合计数。

学习了 yyyyxh 大佬的题解。

枚举有 \(x_1\) 行恰好有 \(1\)\(1\),那么有 \(x_2 = n-x_1\) 恰好有 \(2\)\(1\)

那么所有列加起来 \(1\) 的个数 \(y_1+2y_2 = x_1+2x_2\),所以可以直接求出 \(y_1,y_2\)

问题就是有 \(m\) 种球,其中 \(y_1\) 种各有 \(1\) 个,\(y_2\) 种各有 \(2\) 个。有 \(n\) 个桶,其中 \(x_1\) 个容量为 \(1\)\(x_2\) 个容量为 \(2\)。问有多少种放球方式,满足每个桶都放满,且一个桶里不能放两个同一种球。

桶和球的种类都是有编号的,但是编号不影响计数,所以答案乘上组合数 \(\binom{n}{x_1} \binom{m}{y_1}\) 即可。

一个错误答案是 \((y_1+2y_2)!\)

有两个难处理的问题:

  1. 两个同种球是无序的,容量为 \(2\) 的桶里面两个球也是无序的。
  2. 一个桶不能放两个同种球。

情况 \(1\) 我们就对答案乘上 \(\frac{1}{2^{x_2+y_2}}\)

情况 \(2\) 考虑容斥。外层只有枚举的 \(O(\min(n,m))\) 复杂度,所以放心容斥。

具体地,就是随便放 \(-\) 钦定一个容量为 \(2\) 的桶放两个一样的球 \(+\) 钦定两个容量为 \(2\) 的桶放两个一样的球……

钦定的方案数就是除去那几个行和列,剩下随便放的方案数。

\[\sum_{k=0}^{\min(x_2,y_2)} \binom{x_2}{k} \binom{y_2}{k} k! (-1)^k \frac{(y_1+2y_2-2k)!}{2^{x_2+y_2-2k}} \]

\(k!\) 是计算每个钦定的桶对应什么种类的球。

这对吗?实际上是错的,如果有两个同种球被放在一个桶里的情况,直接算排列只是多算了 \(1\) 次,而你以为有 \(3\) 次都是多算的。所以当你钦定这两个同种球必须在一个桶里的时候,需要把多减的加回来。就是说容斥要带系数 \(2^k\),体现在分母那里变成 \(2^{x_2+y_2-k}\)

总的式子就是:

\[\sum_{x_1+x_2=n, y_1+y_2=m, x_1+2x_2=y_1+2y_2} \binom{n}{x_1} \binom{m}{y_1} \sum_{k=0}^{\min(x_2,y_2)} \binom{x_2}{k} \binom{y_2}{k} k! (-1)^k \frac{(y_1+2y_2-2k)!}{2^{x_2+y_2-k}} \]

\(\binom{x_2}{k} \binom{y_2}{k} k! (-1)^k \frac{(y_1+2y_2-2k)!}{2^{x_2+y_2-k}}\) 算出来是小数,很反直觉。大概是容斥容的。

复杂度 \(O(\min(n,m)^2)\)

code

好难。

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace hesitate {constexpr int N=6e3+7,Max=6e3,mod=1e9+7;int add(int a,int b) { return a+b>=mod ? a+b-mod : a+b; }void _add(int &a,int b) { a=add(a,b); }int mul(int a,int b) { return 1ll*a*b%mod; }void _mul(int &a,int b) { a=mul(a,b); }int ksm(int a,int b=mod-2) {int s=1;while(b) {if(b&1) _mul(s,a);_mul(a,a);b>>=1;}return s;}int fac[N],ifac[N],mi[N],imi[N];void init() {fac[0]=mi[0]=1;rep(i,1,Max) fac[i]=mul(fac[i-1],i);rep(i,1,Max) mi[i]=add(mi[i-1],mi[i-1]);ifac[Max]=ksm(fac[Max]);per(i,Max-1,0) ifac[i]=mul(ifac[i+1],i+1);imi[Max]=ksm(mi[Max]);per(i,(Max)-1,0) imi[i]=add(imi[i+1],imi[i+1]);}int c(int n,int m) { return mul(fac[n],mul(ifac[m],ifac[n-m])); }int n,m;int ans;void main() {init();sf("%d%d",&n,&m);rep(x1,0,n) {int x2=n-x1,y2=x1+(x2<<1)-m,y1=m-y2;if(y2<0 || y1<0) continue;int s=0;rep(k,0,min(x2,y2)) {int sum= (k&1) ? mod-1 : 1;_mul(sum,mul(mul(c(x2,k),c(y2,k)),fac[k]));_mul(sum,mul(fac[y1+(y2<<1)-(k<<1)],imi[x2+y2-k]));_add(s,sum);}_mul(s,mul(c(n,x1),c(m,y1)));_add(ans,s);}pf("%d\n",ans);}
}
int main() {#ifdef LOCALfreopen("in.txt","r",stdin);freopen("my.out","w",stdout);#endifhesitate :: main();
}

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

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

相关文章

qt 实现窗口置顶,qtdesigner创建的widget窗口集成程序里的用法

参考 https://blog.csdn.net/Larry_Yanan/article/details/123518788 .ui文件如下新建的ui文件,编译一下就会生成对应的 ui_xxx.h 文件,文件内就有对应的 namespace Ui 声明的变量,这个变量要在mainwindow.h中声明,然后在mainwindow.cpp中new出来,具体使用如下 mainwindow…

如何在市场推广活动中实现精准的任务分配?5个项目管理技巧

一、引言 随着市场竞争的加剧和消费者需求的多样化,企业对市场推广活动的要求越来越高。市场推广活动不仅需要创意和精准的目标定位,还需要高效的执行和完善的管理。在这种背景下,如何通过有效的活动管理来提升推广活动的执行力,已成为市场团队面临的一个巨大挑战。 市场推…

Android编译 - 证书介绍

前言全局说明一、说明 1.1 环境: Android1.2 简介 在Android系统中,每个APK文件必须有一个有效的数字证书来证明其来源和完整性。当需要修改APK后再次发布时,原有的签名将不再有效,因此需要重新签名。二、证书工具 2.1 路径: android/build/tools/releasetools/sign_target…

域名解析的QPS防护值是什么?

在当今数字化的时代,互联网已经渗透到生活的方方面面,而域名解析作为互联网运行的关键环节之一,起着至关重要的作用。其中,域名解析的QPS防护值更是保障网络稳定、安全与高效的一个重要指标。 一、QPS 防护值的定义与内涵 QPS,即Queries Per Second,意为每秒查询次数。域…

远程开机详细教程

要实现远程开机,被控端必须满足以下条件: 1.目前仅支持windows系统实现远程开机 2.被控端所在局域网内,需要有另一台设备保持todesk在线 如:其他电脑、iPhone、iPad、Android 设备(手机、平板)、家人的手机(充当辅助开机设备) 如图,辅助开机设备需显示在线,离线状态无法发…

CH585的SPI驱动WS2812

目录 链接: https://pan.baidu.com/s/1Su5dgmVWLre5kH2fYiGwQQ?pwd=wch6 CH573系列/583系列/592系列MCU,在使用SPI模拟WS2812波形时,MISO-PA15引脚上的实时电平,会影响MOSI-PA14引脚上的空闲电平状态,故建议SPI驱动WS2812的场景下,固定PA15的电平,不要接其他外设。异常场…

企业微信客服系统-实现对接微信客服接口与分配客服功能-实现GPT回复功能

企业微信客服是有对外的接口的,可以将用户发过来的消息传递给我们系统(注意,这里说的是企业微信客服,不是企业微信员工,也不是个人微信,这三个不是一回事)。并且,我们系统还可以实现,多个微信客服入口,分配到多个我们客服坐席,客服不在线时,可以分配给别人。微信客…

异地多活架构如何设计:活好你也好【转】

异地多活是分布式系统架构设计的一座高峰,当业务系统走到需要考虑异地多活这一步,其体量和复杂度都会达到很高的水准。接入层、逻辑层、数据层的三层架构,基本上是每个业务都会拥有的基础架构形态,而三层架构的关键在于数据层,本文将从数据层切入探讨异地多活对于基础架构…

一文告诉你什么是WBS——附应用方案

通过这些,结合板栗看板使用WBS可以极大地提高项目管理的效率和透明度,确保项目按时完成并达到预期目标。一、定义与原理 WBS(Work Breakdown Structure),即工作分解结构,是一种项目管理方法,它将一个复杂的项目或任务按照一定的原则分解成更小、更具体的部分,以便于管理…

思维导图xmind如何安装?附安装包

前言 大家好,我是小徐啊。我们在Java开发中,有时候是需要用到思维导图的,这可以帮助我们更好的理清思路,提高开发的效率。而说到思维导图,最有名的就是xmind了,它的功能十分强大,几乎是思维导图里面最强大的那一个。但是,默认只能使用初级功能,高级功能需要额外再开通…