20250205 省选模拟赛 T3

news/2025/2/5 22:52:06/文章来源:https://www.cnblogs.com/XP3301Pipi/p/18700277

20250205 省选模拟赛 T3

Description

设计一个 \(n\times n\) 的 01 矩阵,使得从 \((1,1)\) 走到 \((n,n)\) 且只能向右或下走且只经过为 \(1\) 的格子的方案数为 \(X\)

\(n \leq 24\) 时得满分。\(X \leq 10^9\)

Solution

基于 \(2\) 进制的构造方法

我们称从左上到右下的 \(2\times 2\) 的方块为 “基块”,延伸至右侧的长条为 “导线”。最右侧的导线占据了 \((1,n)\)\((n,n)\)

从一个红色方块走到右下方的红色方块,方案数为 \(2\)。从 \(0\) 从左上到右下标号,走到第 \(i\) 个方格的走法有 \(2^i\) 种。

构造方法为,如果 \(X\) 在二进制下第 \(i\) 位为 \(1\),我们就从第 \(i\) 个红色方块向右拉一条导线。

基于 \(6\) 进制的构造方法

将基块改为 \(3\times 3\),那么从基块的左上角走到右下角方案数为 \(6\)

\(6\) 进制下,如果 \(X\) 的第 \(i\) 位有值,我们就向下或向右拉一条导线。

此时需要图中蓝色和绿色的 “位块” 来处理每一位的值,对 \(1,2,3,4,5\) 分别构造。

基于 \(20\) 进制的构造方法

同上,我们将基块改为 \(4\times 4\),走完一个基块的方案数变为 \(20\)

此时我们需要 \(4 \times 5\) 的位块,它们需要满足最右侧全部为 \(1\),以接在导线上。

使用 dfs 进行枚举:

void dfs(int x,int y){if(!x) return Check();if(!y) return dfs(x-1,m);if(y!=m&&(!(x==1&&y==1))){a[x][y]=0; dfs(x,y-1);if(ok) return;}a[x][y]=1; dfs(x,y-1);
}

如果再像上面一样构造,\(n\) 至少为 \(25\)。考虑对最高位进行优化。

最高位的位块我们改为 \(3 \times 6\),这样可以同时利用两条导线,省掉一行一列。

由于 \(X\leq 10^9\),只需要处理 \(1\sim 15\)。它们需要满足最下方和最右方都为 \(1\)

但我们无法构造出 \(13,14\) 的位块。考虑换用 \(4\times 6\)

绿色部分为新换用的位块。为了避免与左侧位块 “粘连”,橙色区域必须为 \(0\)

int val1[23][8][8],val2[23][8][8];
int f[8][8],X,c[8];
bool ok;void Check1(int k){memset(f,0,sizeof(f));f[0][0]=1;for(int i=0;i<=4;i++){for(int j=0;j<=3;j++){if(i<4&&val1[k][i+1][j]) f[i+1][j]+=f[i][j];if(j<3&&val1[k][i][j+1]) f[i][j+1]+=f[i][j];}}if(f[4][3]==k) ok=1;
}void dfs1(int x,int y,int k){if(x<0) return Check1(k);if(y<0) return dfs1(x-1,3,k);if(y!=3&&(!(x==0&&y==0))){val1[k][x][y]=0;dfs1(x,y-1,k);if(ok) return;}val1[k][x][y]=1;dfs1(x,y-1,k);
}void Check2(int k){memset(f,0,sizeof(f));f[0][0]=1;for(int i=0;i<=5;i++){for(int j=0;j<=2;j++){if(i<5&&val2[k][i+1][j]) f[i+1][j]+=f[i][j];if(j<2&&val2[k][i][j+1]) f[i][j+1]+=f[i][j];}}if(f[5][2]==k) ok=1;
}void dfs2(int x,int y,int k){if(x<0) return Check2(k);if(y<0) return dfs2(x-1,2,k);if(y!=2&&x!=5&&(!(x==0&&y==0))){val2[k][x][y]=0;dfs2(x,y-1,k);if(ok) return;}val2[k][x][y]=1; dfs2(x,y-1,k);
}void Check3(int k){memset(f,0,sizeof(f));f[0][0]=1;for(int i=0;i<=5;i++){for(int j=0;j<=3;j++){if(i<5&&val2[k][i+1][j]) f[i+1][j]+=f[i][j];if(j<3&&val2[k][i][j+1]) f[i][j+1]+=f[i][j];}}if(f[5][3]==k) ok=1;
}void dfs3(int x,int y,int k){if(x<0) return Check3(k);if(y<0) return dfs3(x-1,3,k);if(y!=3&&x!=5&&(!(x==0&&y==0))){val2[k][x][y]=0;dfs3(x,y-1,k);if(ok) return;}if(!(y==0&&x<5&&x>=2)){val2[k][x][y]=1;dfs3(x,y-1,k);if(ok) return;}
}void Init(){for(int i=1;i<=19;i++){ok=0;dfs1(4,3,i);}for(int i=1;i<=15;i++){if(i==13||i==14) continue;ok=0;dfs2(5,2,i);}ok=0; dfs3(5,3,13);printf("X=%d:\n",13);for(int j=0;j<=5;j++){for(int k=0;k<=3;k++) putchar(val2[13][j][k]+'0');puts("");}ok=0; dfs3(5,3,14);printf("X=%d:\n",14);for(int j=0;j<=5;j++){for(int k=0;k<=3;k++) putchar(val2[14][j][k]+'0');puts("");}
}int ans[26][26];signed main(){FileIO();Init();read(X);for(int i=1;i<=7;i++){c[i]=X%20;X/=20;// printf("C[%d]=%d\n",i,c[i]);}for(int i=1;i<=24;i++) ans[i][24]=ans[24][i]=1;for(int i=1,x=1;i<=6;i++,x+=3){for(int j=0;j<=3;j++){for(int k=0;k<=3;k++)ans[x+j][x+k]=1;}}for(int i=1,x=1;i<=7;i++,x+=3){// printf("I=%d,X=%d\n",i,x);if(!c[i]) continue;if(i%2==0){for(int j=x;j<=24;j++) ans[j][x]=1;for(int j=0;j<=3;j++){for(int k=0;k<=4;k++)ans[24-(3-j)][x+k]=val1[c[i]][k][j];}}else if(i<=6){for(int j=x;j<=24;j++) ans[x][j]=1;for(int j=0;j<=4;j++){for(int k=0;k<=3;k++)ans[x+j][24-(3-k)]=val1[c[i]][j][k];}}else if(c[i]==13||c[i]==14){for(int j=x;j<=24;j++) ans[x][j]=1;for(int j=0;j<=5;j++){for(int k=0;k<=3;k++)ans[x+j][24-(3-k)]=val2[c[i]][j][k];}}else{for(int j=x;j<=24;j++) ans[x][j]=1;for(int j=0;j<=5;j++){for(int k=0;k<=2;k++)ans[x+j][24-(2-k)]=val2[c[i]][j][k];}}}puts("24");for(int i=1;i<=24;i++){for(int j=1;j<=24;j++){putchar(ans[i][j]+'0');putchar(' ');}puts("");}return 0;
}

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

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

相关文章

Automa:自动化浏览器工作流

🏷️仓库名称:AutomaApp/automa 🌟截止发稿星数: 14340 (今日新增:33) 🇨🇳仓库语言: Vue 🤝仓库开源协议:Other 🔗仓库地址:https://github.com/AutomaApp/automa引言 Automa是一个浏览器扩展,允许用户通过连接模块来自动化浏览器任务。它消除了重复性任务的需…

本地部署DeepSeek教程

本地部署DeepSeek教程 步骤 本地部署DeepSeek教程步骤 1 安装Ollama 2 下载DeepSeek模型 3 可视化图文交互界面Chatbox(可选)1 安装Ollama 访问Ollama官网下载Ollama,默认安装即可。安装完成后打开终端(我这里是windows系统),输入: ollama help即可查看ollama选项,且可…

OpenLDAP篇-安装OpenLDAP服务01

1、OpenLDAP统⼀⽤户认证系统 1.1 为什么需要OpenLDAP 在没有OpenLDAP统⼀⽤户认证系统的环境中,往往会⾯临如下问题:1、当⽤户需要访问多台服务器时,管理员需要在每台服务器上⼿动创建账户。如果员⼯离职,还需逐台删除账户,整体操作繁琐且容易出现遗漏的情况,因此存在较…

集训3 20240127

集训3 20240127 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A: 题目大意:给定 \(n\) ,两个人轮流可以使 \(n\) 减去一个任意小于它且与它互质的数,求最后甲能否取胜 #include<bits/stdc++.h>using namespace std;int main() {long long n;cin&g…

RocketMQ实战—4.消息零丢失的方案

大纲 1.全链路分析为什么用户支付完成后却没有收到红包 2.RocketMQ的事务消息机制实现发送消息零丢失 3.RocketMQ事务消息机制的底层实现原理 4.是否可以通过同步重试方案来代替事务消息方案来实现发送消息零丢失 5.使用RocketMQ事务消息的代码案例细节 6.同步刷盘+Raft协议同步…

qoj7301 AGC036D 题解

qoj7301 orz yxx 有一个很牛的状态设计 \(f_{i,j,0/1}\),\(0\) 为 \(a_{i-1}>a_i\),\(j\) 记录 \(a_{i-1}\) 的值,\(a_i\) 的值未定;\(1\) 为 \(a_{i-1}<a_i\),\(j\) 记录 \(a_i\) 的值 这样可以完美解决 \(a_{i-1}>a_i<a_{i+1}\) 的问题 转移和优化都是简单的…

【PyTorch】对比Torch和Numpy

该部分主要通过对比Torch和Numpy基础知识,方便大家了解PyTorch。Numpy是处理数据的模块,处理各种矩阵的形式来多核加速运算。 Torch自称为神经网络界的Numpy,因为它能将torch产生的tensor(张量)放在 GPU 中加速运算(前提是你有合适的 GPU),就像Numpy会把array放在CPU中…

十. Redis 事务和 “锁机制”—— 并发秒杀处理的详细说明

十. Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明 @目录十. Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明1. Redis 的事务是什么?2. Redis 事务三特性3. Redis 关于事务相关指令 Multi、Exec、discard和 “watch & unwatch”3.1 快速入门(演示…

使用Tauri框架打造的FPS透视

使用Tauri框架打造的FPS透视,使用javascript读内存绘制透视框使用Vue前端和Rust后端打造FPS透视 前端使用P5js进行canvas绘制 后端封装内存读取工具,前端快速编写代码无需重启调试 Vue前端与后端通讯获取内存数据并在前端渲染 作者声明 [仅供学习 请勿非法用途 从事非法用途出…

Mybatis 动态查询

where和if标签搭配 user表如下图所示 有时候,我们想在java程序中自定义查询条件,例如,我想查询user表,有时候我输入name=“狂神”,查询所有name为狂神的数据,有时候我输入pwd=‘123456’,想查询所有密码为123456的数据,有时候我想查询name为狂神同时密码为123456的数据…

一文搞懂企业架构与DDD的融合

在当今数字化时代,企业架构(EA)和领域驱动设计(DDD)成为了构建高效、灵活且可扩展软件系统的关键方法论。本文将深入探讨企业架构TOGAF框架与DDD的融合之道,分析如何通过这种结合实现从业务战略到技术实现的无缝对接。今天聊聊企业架构与DDD如何进行融合。一、企业架构TO…