2023NOIP A层联测23-涂鸦

news2024/11/28 14:33:43

有一面由 n × m n\times m n×m 个格子组成的墙,每个格子要么是黑色,要么是白色。你每次将会进行这样的操作:等概率随机选择一个位置 ( x , y ) (x,y) (x,y),和一个颜色 c c c(黑色或者白色)( 1 ≤ x ≤ n , 1 ≤ y ≤ m 1≤x≤n,1≤y≤m 1xn,1ym,任意 ( x , y , c ) (x,y,c) (x,y,c) 的组合选择它的概率均为 1 2 ∗ n ∗ m \frac1{2∗n∗m} 2nm1),然后将在 ( x , y ) (x,y) (x,y) 左上⻆的所有格子的颜色涂成 c c c。即将所有满足 1 ≤ x ′ ≤ x , 1 ≤ y ′ ≤ y 1≤x′≤x,1≤y′≤y 1xx,1yy ( x ′ , y ′ ) (x′,y′) (x,y) 格子上的颜色涂成 c c c。这次操作的代价为涂的格子的数量,即 x × y x\times y x×y。给定初始状态和终止状态,问期望要花费多少代价才能将墙面从初始状态涂成终止状态。答案模 998244353 998244353 998244353

n , m ≤ 5 n,m\le5 n,m5


先考虑朴素的 dp,对墙上的每个格子进行状态压缩,总共有 2 n m 2^{nm} 2nm 个状态,设 f i f_i fi 表示状态 i i i 期望还要花费多少代价才能到达最终状态。转移为
f i = ∑ f j + w 2 n m f_i=\sum\dfrac{f_j+w}{2nm} fi=2nmfj+w

其中 j j j 表示一个格子的左上角都涂成黑色或白色所得到的状态, w w w 是涂一次颜色的代价。

这是有后效性 dp,可以高斯消元解决,时间复杂度 O ( 2 3 n m ) O(2^{3nm}) O(23nm),可以得到 60pts。

下面考虑减少状态。

考虑一个状态,若一个格子的颜色与最终状态的颜色不同,则这个点后面一定会修改,其左上角的点同样,所以这些点的颜色是什么就不重要了,反正后面都要被改。记 p i , j p_{i,j} pi,j 表示状态中坐标为 ( i , j ) (i,j) (i,j) 的点的颜色是否(1/0)与终止状态一样,通过模拟可以发现, p p p 数组中构成 1 1 1 的元素是类似阶梯的形状。如下图,圆点表示在这个格子颜色与最终状态的不一样,矩形表示
范围内的格子要被修改,红色部分就是 p i , j p_{i,j} pi,j 1 1 1 的部分。

在这里插入图片描述
称这个矩阵为阶梯矩阵,原来的状态称为 01 矩阵。

那么,所有的 01 矩阵都能唯一转化为一个阶梯矩阵,所以只需将原来的状态换成新的阶梯状态进行高斯消元即可。

而阶梯状态是不多的,只有 ( n + m n ) \binom{n+m}{n} (nn+m) 种,下面证明。

考虑每一行,看每行红色部分的格子数量,容易发现它们是有单调性的,设格子数量为 i i i 的行数为 x i x_i xi,即方案就是求 ∑ i = 0 n x i = m \sum\limits_{i=0}^nx_i=m i=0nxi=m 的解的个数,这是组合数学的经典问题,易证。

( n + m n ) \binom{n+m}{n} (nn+m) 最大也就 ( 10 5 ) = 252 \binom{10}{5}=252 (510)=252,高斯消元绰绰有余。

实现上,可以用 dfs 求出阶梯矩阵的状态和个数,01 矩阵转换成阶梯矩阵直接暴力枚举(时间充裕)每个点,若颜色不相同就直接对左上角修改。高斯消元要写模意义下的,我的实现直接用快速幂求逆元。

总的时间复杂度为 O ( ( n + m n ) 3 + ( n + m n ) n 3 m 3 ) O\left(\binom{n+m}{n}^3+\binom{n+m}{n}n^3m^3\right) O((nn+m)3+(nn+m)n3m3)

具体实现参照代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
const int N=260;
ll a[N][N],val[N];
int fr[N],nn,mm,n,m,cnt;
char s1[N][N],s2[N][N];
unordered_map<int,int> ma;
vector<int> v;
ll ksm(ll a,ll b)
{
    ll ans=1;
    while(b){
        if(b&1) ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
int gauss()
{
    int r=1,c=1;
    for(;r<=nn&&c<=mm;r++,c++){
        int maxn=r;
        for(int i=r+1;i<=nn;i++) if(abs(a[maxn][c])<abs(a[i][c])) maxn=i;
        for(int j=1;j<=mm+1;j++){
            swap(a[maxn][j],a[r][j]);
        }
        if(abs(a[r][c])==0){r--;continue;}
        for(int i=1;i<=nn;i++){
            if(i==r) continue;
            ll g=(a[i][c]*ksm((a[r][c]%mod+mod)%mod,mod-2)%mod+mod)%mod;
            for(int j=1;j<=mm+1;j++)
                a[i][j]=(a[i][j]-a[r][j]*g%mod+2*mod)%mod;
        }
    }
    for(int i=r;i<=nn;i++){
        if(abs(a[i][i])==0&&abs(a[i][mm+1])>0){
            return -1;
        }
    }
    memset(fr,0x3f,sizeof(fr));
    for(int i=1;i<r;i++){
        int cnt=0,num=0;
        for(int j=1;j<=mm;j++) if(fr[j]&&abs(a[i][j])>0) cnt++,num=j;
        if(cnt==1) fr[num]=0,val[num]=(a[i][mm+1]*ksm((a[i][num]%mod+mod)%mod,mod-2)%mod+mod)%mod;
    }
    return 1;
}
int getid(int x,int y){return (x-1)*m+y;}
void dfs(int x,int k,int state)
{
    if(!x){
        ma[state]=++cnt;
        v.push_back(state);
        return;
    }
    for(int i=0;i<=k;i++) dfs(x-1,i,state|((1<<x*m)-1^(1<<x*m-i)-1));
}
int change(int id)
{
    int newid=(1<<n*m)-1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if((id>>getid(i,j)-1&1)!=(s2[i][j]=='B')){
                for(int ii=1;ii<=i;ii++){
                    for(int jj=1;jj<=j;jj++){
                        newid&=INT_MAX^(1<<getid(ii,jj)-1);
                    }
                }
            }
        }
    }
    return newid;
}
int main()
{
    freopen("graffiti.in","r",stdin);
    freopen("graffiti.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%s",s1[i]+1);
    for(int i=1;i<=n;i++) scanf("%s",s2[i]+1);
    int finish=0,start=0;
    for(int i=n;i>=1;i--){
        for(int j=m;j>=1;j--){
            finish=finish*2+(s2[i][j]=='B');
            start=start*2+(s1[i][j]=='B');
        }
    }
    dfs(n,m,0);
    int N=1<<n*m;
    nn=mm=v.size();
    for(int i=0;i<v.size();i++){
        int t=v[i];
        if(i==ma[change(finish)]-1){
            a[i+1][i+1]=1;
            continue;
        }
        int tt=0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(t>>getid(i,j)-1&1) tt|=(s2[i][j]=='B')<<getid(i,j)-1;
                else tt|=(s2[i][j]=='W')<<getid(i,j)-1;
            }
        }
        a[ma[t]][ma[t]]+=2*n*m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                int id=tt;
                for(int ii=1;ii<=i;ii++){
                    for(int jj=1;jj<=j;jj++){
                        id|=1<<(getid(ii,jj)-1);
                    }
                }
                int newid=change(id);
                a[ma[t]][nn+1]+=i*j;
                a[ma[t]][ma[newid]]--;
                for(int ii=1;ii<=i;ii++){
                    for(int jj=1;jj<=j;jj++){
                        id^=1<<(getid(ii,jj)-1);
                    }
                }
                newid=change(id);
                a[ma[t]][nn+1]+=i*j;
                a[ma[t]][ma[newid]]--;
            }
        }
    }
    int czn=gauss();
    printf("%lld\n",val[ma[change(start)]]);
}

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

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

相关文章

docker 安装 minio (单体架构)

文字归档&#xff1a;https://www.yuque.com/u27599042/coding_star/qcsmgom7basm6y64 查询 minio 镜像 docker search minio拉取镜像 docker pull minio/minio创建启动 minio 容器 用户名长度至少为 3&#xff0c;密码长度至少为 8 docker run \ -p 9000:9000 \ -p 9090:909…

第6天:信息打点-Web架构篇amp;域名amp;语言amp;中间件amp;数据库amp;系统amp;源码

第6天&#xff1a;信息打点-Web架构篇&域名&语言&中间件&数据库&系统&源码 #知识点&#xff1a; 1、打点-Web架构-语言&中间件&数据库&系统等2、打点-Web源码-CMS开源&闭源售卖&自主研发等 开源&#xff1a;可以上网搜索&#x…

redis-plus-plus常用函数介绍以及redis的一些边缘知识

文章目录 渐进式遍历scan数据库管理使用C调用redis安装redis-plus-plus get, set, exists , del, keysexpire, typestring的set, mset, mgetgetrange, setrangeincr, decrlpush, lrange,lpop, rpopblpop, llensadd, smemberssismember, scardsinter, sinterstorehset, hget, he…

创意无限,体验非凡——Cinema 4D 2024 Mac 版强势来袭

尊贵的设计师们&#xff0c;艺术与技术的完美结合&#xff0c;正是我们对于设计行业的追求。而在这个追求中&#xff0c;Cinema 4D 2024 Mac 版的问世&#xff0c;必将成为您的得力助手&#xff0c;为您的创作之路注入无限的活力与灵感。 Cinema 4D 一直以来都是设计师们最爱用…

导轨电表适不适合家用?

导轨电表&#xff0c;作为一种新型的电能计量设备&#xff0c;近年来在我国得到了广泛的应用。然而&#xff0c;对于家用市场来说&#xff0c;导轨电表是否适用仍然存在争议。那么&#xff0c;导轨电表适不适合家用呢&#xff1f;接下来&#xff0c;小编来为大家讲解下&#xf…

kaggle使用说明

kaggle kaggle使用参考1、kaggle目录2、kaggle上传本地文件后&#xff0c;如何不改代码就可运行3、已上传文件的修改3.1 重新上传3.2 重写文件 4、创建文件夹5、结果下载5.1 多文件&#xff1a;先打包再下载5.2 重定文件下载链接 kaggle使用参考 Kaggle 新手入门必看&#xff…

InetAddress.getLocalHost() 执行非常慢

昨天同事反馈网关的请求非常慢&#xff0c;一个获取的token的接口响应都超过了30s&#xff0c;还好只是测试环境。 经过验证&#xff0c;几乎所有接口响应都很慢&#xff0c;很多都响应超时。 排查步骤&#xff1a; 0. 本地启动项目测试&#xff0c;没有这个问题。而且生产环…

COCOS2DX3.17.2 Android升级targetSDK30问题解决方案

一、luajit不兼容问题 不兼容版本&#xff1a;【2.1.0-bate2、2.1.0-bate3都存在异常】 出问题系统&#xff1a;Android11&#xff1b;Android10的系统部分机型有问题&#xff0c;部分机型正常 异常点1&#xff1a;c调用lua接口&#xff0c;pushObjiect的时候crash 异常点2…

Skywalking介绍

一个优秀的项目&#xff0c;除了具有高拓展的架构、高性能的方案、高质量的代码之外&#xff0c;还应该在上线后具备多角度的监控功能。现在企业中的监控服务也有很多&#xff0c;Skywalking除了提供多维度、多粒度的监控之外&#xff0c;也提供了良好的图形化界面以及性能剖析…

研究人员发现34个Windows驱动程序易受完全设备接管攻击

最近&#xff0c;研究人员发现了34个易受攻击的Windows驱动程序&#xff0c;这些漏洞可能被非特权威胁行为者利用来完全接管设备&#xff0c;并在底层系统上执行任意代码。这一发现引发了广泛关注&#xff0c;并引起了Windows用户的担忧。 导语 随着科技的不断进步&#xff0c;…

【23真题】最难!两电一邮中最难的!

今天分享的是23年西安电子科技大学821的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年西电811考研真题&#xff0c;我发布过&#xff0c;若有需要戳这里自取&#xff01;这里统计了811的上岸平均分为110-120分&#xff01;最高分为143分&#xff0c;该院校考察的是…

06.Oracle数据备份与恢复

Oracle数据备份与恢复 一、通过RMAN方式备份二、使用emp/imp和expdb/impdb工具进行备份和恢复三、使用Data guard进行备份与恢复 一、通过RMAN方式备份 通过 RMAN&#xff08;Oracle 数据库备份和恢复管理器&#xff09;方式备份 Oracle 数据库&#xff0c;可以使用以下步骤&a…

dubbo没有找到生产者

1、没有找到生产者 com.alibaba.dubbo.rpc.RpcException: No provider available from registry 127.0.0.1:2181 for service .... , please check status of providers(disabled, not registered or in blacklist)2、 查看是不是 对应的providers 没有 注册上去 找到 zk 对应…

每天五分钟计算机视觉:池化层的反向传播

本文重点 卷积神经网络(Convolutional Neural Network,CNN)作为一种强大的深度学习模型,在计算机视觉任务中取得了巨大成功。其中,池化层(Pooling Layer)在卷积层之后起到了信息压缩和特征提取的作用。然而,池化层的反向传播一直以来都是一个相对复杂和深奥的问题。本…

【报错】错误 C1004 :发现意外的文件尾

文章目录 情景在现出错原因解决方案问题解决 情景在现 出错原因 这个错误通常是由于您在源文件中漏写了某些括号或者分号&#xff0c;导致编译器在处理到文件末尾时发现没有遇到预期的符号。 解决方案 解决这个错误的方法是&#xff0c;打开您的源文件&#xff0c;仔细检查是否…

虾皮买家号批量注册软件

shopee买家通系统可以自动注册虾皮买家号&#xff0c;并且支持多个国家使用&#xff0c;可以用于菲律宾、印度尼西亚、泰国、马来西亚、越南等。 如果想要自动化注册&#xff0c;资料方面也有一定要求&#xff0c;手机号需要相应国家的号码 ip环境也要用相应国家的才可以&…

C# 3D人脸重建,人头姿势估计

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.…

道本科技||紧跟数字化转型趋势,企业如何提高合同管理能效?

随着数字化转型的快速发展&#xff0c;合同管理对于企业的运营效率和风险控制起着至关重要的作用。那么&#xff0c;如何紧跟数字化转型趋势&#xff0c;利用现代技术和工具提高合同管理的能效&#xff0c;以实现企业更高效、更安全的合同管理就成了企业管理中的核心问题。 在…

【MySQL事务篇】事务基础知识

事务基础知识 文章目录 事务基础知识1. 概述2. 事务的ACID特性3. 事务的状态4. 事务的使用4.1 显式事务4.2 隐式事务 5. 事务隔离级别5.1 数据并发问题5.2 SQL中的四种隔离级别 1. 概述 事务&#xff1a;一组逻辑操作单元&#xff0c;使数据从一种状态变换到另一种状态 事务处…

ECharts折线图去掉图例和线段上的小圆点

官方的初始效果 折线图的图例有小圆点&#xff0c;并且图表中也有小圆点 最终效果 去掉图例和图标中的小圆点 并且柱状图和折线图的图例要不同 代码实现 去掉图例小圆点 官方文档 itemStyle: { opacity: 0 } 折线图中的小圆点去掉 官方文档 两个代码二选一就行&#x…