前言

数学符号约定

\(n\):任意正整数。

\(\#\):从未出现过的小写字母。

\(\Sigma\):字符集,这里指小写字母集合。

\(S\):最终答案的字符矩阵。

其余符号同题目翻译中所写。

如非特殊说明,将会按照上述约定书写符号。

题目大意

构造一个 \(N\times M\) 的小写字母矩阵,使得其中有 \(R\) 行 \(C\) 列是回文串,如果无解,输出 IMPOSSIBLE

题目分析

首先,让我们仔细阅读一下题目,然后可以得到一个比较显然的性质,就是在 \(R\lt N\) 和 \(C \lt M\) 的时候我们行回文串与列回文串的位置是不重要的,也就是位置无关,可以放到任意位置。证明比较显然,考虑我们如果想要满足任意列数 \(C\;(C\lt N)\) 的话至多会使得一行无法形成回文串,但是此时目标要求 \(R \lt N\) 即 \(R_{\max} = N-1\),所以能够达到题目要求。

所以,我们现在考虑一下 \(R\lt N\) 且 \(C \lt M\) 的情况下怎么填。考虑让我们的回文串填的暴力一点,即全都填一个字符,这个时候我们预期达到的效果如图所示:

其中,蓝色部分全填的字符 \(\#\),橙色部分所填字符比较复杂,它的填写规则是这样的:

对于第 \(i\) 行第 \(j\) 列(这里的 \(i,\,j\) 是相对于橙色矩形的第 \(i\) 行第 \(j\) 列)填写字符 \((i+j) \bmod (|\Sigma| - 1)\)。

可以证明,根据上述填写方法,能够保证第 \(R+1 \sim N\) 行和第 \(C+1\sim M\) 列不会出现回文串,理由如下:

考虑回文串的定义,如果我们想让第 \(i\) 行字符串为回文串,则需要满足下面条件:

\[\forall j \in [1,M]\qquad S_{i,j} = S_{i,M-j+1}
\]

现在我们 \(S_{i,j}\) 位置上的字符进行分类讨论:

  1. 如果 \(S_{i,j} = \#\),则显然当前字符串不为回文串,理由如下:

    如果 \(S_{i,j} = \#\) 且 \(S_{i,j} = S_{i,M-j+1}\),由于橙色部分不可能出现 \(\#\),则说明 \(C = M\),不符合前置条件 \(C\lt M\),故不成立。

  2. 如果 \(S_{i,j} \not= \#\),则说明 \(C=0\),那么证明 \(S_{i,j} = S_{i,M-j+1}\),就等价于证明:

    \[\forall j\in [1,M]\qquad i+j \equiv i+M-j+1 \pmod{|\Sigma| -1}
    \]

    移项,可以得到:

    \[\forall j\in [1,M]\qquad 2j \equiv M+1 \pmod{|\Sigma|-1}
    \]

    考虑将同余式转化为线性不定方程:

    \[2j + (|\Sigma| - 1)y = M+1
    \]

    根据裴蜀定理,若我们想要方程组有解,则需要满足 \(\gcd(2,|\Sigma| - 1) \mid (M+1)\),由于 \(\gcd(2,|\Sigma| - 1) = \gcd(2,25) = 1\),所以原线性不定方程有解。

    那么此时,我们假设最小的解 \(j_0 \in [1,M]\),根据裴蜀定理可知,上述不定方程关于 \(j\) 的解集 \(J = \{j_t|j_t = j_0 + (|\Sigma| - 1)t,\, t\in [0,+\infty)\}\),那么我们现在证明的命题就变为:

    \[[1,M]\subset J
    \]

    若该命题成立,则显然需要 \(|\Sigma| - 1 = 1\) 即 \(|\Sigma| = 2\),这与我们的条件 \(|\Sigma| = 26\) 不符,故命题不成立。

最后,根据当前的构造方案可以看出,证明列不出现回文串只需要证明行不出现即可,因为我们在第 \(i\) 行第 \(j\) 列所填字符为 \((i+j) \bmod (|\Sigma|-1)\),顺时针或逆时针旋转 \(90^{\circ}\) 本质上就是 \(i\) 与 \(j\) 发生交换,因为加法满足交换律,所以我们从行得到的结论可以用于列上。

接下来,我们就需要处理 \(R = N\) 或 \(C = M\) 的情况了:

先考虑 \(R = N\) 的情况,因为 \(C = M\) 的情况就是沿顺时针或逆时针旋转 \(90^{\circ}\) 而已。

如果我们想在不破坏某一行为回文串的情况下达成 \(C\) 列为回文串的目标,则显然列与列的位置一定是对称的,换句话说,倘若第 \(c\) 列为回文串,则必然 \(M - c + 1\) 这一列也为回文串。

那么不难得出结论,当 \(M\) 为奇数的时候,可以构造出任意的 \(C\),当 \(M\) 为偶数的时候,可以构造出偶数的 \(C\),构造方案考虑最后一行中,让对称的 \(c\) 的位置填 \(\#\),其余位置填字符 \(x\,(x \not = \#)\),即构成如下情况:

\[\begin{aligned}
&\text{奇数且 } C \text{ 为奇数:}\\
& \#\,\cdots \, x\,\cdots\, x\,\#\,x\cdots \# \cdots \#\\
&\text{其余情况:}\\
& \#\,\cdots \, x\,\cdots\, x\,\cdots \,\# \,\cdots \,\#\\
\end{aligned}
\]

综上,我们做完了本题

代码实现

这里给出了关键部分的代码实现,其余部分还恳请读者自己完成:

const char sharp = 'z';
char ansmap[MAX_SIZE][MAX_SIZE]; void main(){
int N = read();
int M = read();
int R = read();
int C = read();
if(R == N && C == M){
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
printf("%c",sharp);
}
printf("\n");
}
} else if(R == N || C == M) {
int flag = 0;
if(C == M){
swap(N,M);
swap(R,C);
flag = 1;
}
if(!(M & 1) && (C & 1)){
printf("IMPOSSIBLE");
return ;
}
for(int i=1;i<N;i++){
for(int j=1;j<=M;j++){
ansmap[i][j] = sharp;
}
}
char x = 'y';
int i = 1;
while(C > 1){
ansmap[N][i] = sharp;
ansmap[N][M-i+1] = sharp;
i++;
C -= 2;
}
if(C){
ansmap[N][(M >> 1) + 1] = sharp;
}
for(i=1;i<=M;i++){
if(ansmap[N][i] != sharp){
ansmap[N][i] = x;
}
}
if(flag)
swap(N,M);
printmat(N,M,flag);
} else {
for(int i=1;i<=R;i++){
for(int j=1;j<=M;j++){
ansmap[i][j] = sharp;
}
}
for(int i=1;i<=N;i++){
for(int j=1;j<=C;j++){
ansmap[i][j] = sharp;
}
}
for(int i=R+1;i<=N;i++){
for(int j=C+1;j<=M;j++){
ansmap[i][j] = ((i+j)%25) + 'a';
}
}
printmat(N,M);
}
}

题解 P9326的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. selenium + python自动化环境搭建

    Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firef ...

  2. 解决Avalonia 11.X版本的中文字体问题

    网上搜索的方法使用接口"IFontManagerImpl"这个方法目前只能用于Avalonia 10.X版本,因为11版本后官方把这个接口的成员都设置成了非plubic,所以之前的 ...

  3. Airtest的iOS实用接口介绍

    1. 前言 前段时间Airtest更新了1.3.0.1版本,里面涉及非常多的iOS功能新增和改动,今天想详细跟大家聊一下里面的iOS设备接口. PS:本文示例均使用本地连接的iOS设备,Airtest ...

  4. MIT6.s081/6.828 lectrue5/6:System call entry/exit 以及 Lab4 心得

    这篇博客主要复习 lecture05:GDB calling conentions 和 lecture06:System call entry/exit 的内容,外加 Lab4:traps 的心得 前 ...

  5. 【双系统】Win10/Win11 引导 Ubuntu

    目录 纲要 注意 写在最前 1. Win 分区 2. Ubuntu刻盘 3. 安装 Ubuntu 4. 配置引导 纲要 本文主要介绍了如何在已安装 Win10/Win11 前提下安装 Ubuntu 双 ...

  6. ImGui界面优化:使用图标字体、隐藏主窗口标题栏

    目录 使用图标字体 扩展:内存加载字体 隐藏主窗口标题栏 增加程序退出 改进HideTabBar 窗口最大化 总结 本文主要介绍ImGui应用中的一些界面优化方法,如果是第一次使用ImGui推荐从上一 ...

  7. 在微服务环境下,远程调用feign和异步线程存在请求数据丢失问题

    一.无异步线程得情况下feign远程调用: 0.登录拦截器: @Component public class LoginUserInterceptor implements HandlerInterc ...

  8. 5.2 磁盘CRC32完整性检测

    CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏.通过运用本校验技术我们可以实现对特定内存区域以及磁 ...

  9. CAP项目集成带身份和证书验证的MongoDB

    大家好,我是Edison. 最近,在使用CAP事件总线时,碰到了这样一个需求:微服务采用的是MongoDB,而且还是带身份验证 和 SSL根证书验证的.由于目前网上能找到的资料,都是不带身份验证的Mo ...

  10. Python面试题——面向对象题

    1.简述面向对象的三大特性. 封装: 封装指的是把一堆数据属性与方法数据放在一个容器中,这个容器就是对象.让对象可以通过 "." 来调用对象中的数据属性与方法属性. 继承: 继承指 ...