前言

数学符号约定

\(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. 一:wince 开发环境

    1:下载相关文件,vs2008 可以自行搜索安装 链接:https://pan.baidu.com/s/1b2shwCqmc1o9x-zsy8CmeA 提取码:qing

  2. Java8 函数式编程stream流

    1.初始环境准备 ​ 场景:现在有一个公司,公司部门有一级部门,二级部门甲和二级部门乙(其中二级部门甲和二级部门乙是一级部门的子部门), 一级部门下面有有001号员工小明,二级部门甲下面有002号员工 ...

  3. 数据库是要拿来用的,不是用来PK先进性的

    周五参加了WAIC后又和一家上海本地的数据库厂商交流了一下午.等我要买高铁票回南京的时候已经买不到票了.好不容易刷到一张到苏州北的高铁票,我就上了车.上车后突然想起还不如就回苏州老家住一晚算了.到家后 ...

  4. 关于NOI2010“超级钢琴”的反思

    [NOI2010] 超级钢琴 题目描述 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 \(n\ ...

  5. 基于C#的窗体阴影效果方案 - 开源研究系列文章

    最近在研究C#的Winform窗体的效果,上次介绍了窗体动画效果的博文( 基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 ),这次将窗体阴影效果的方案进行一个介绍. 找了一下度娘,具 ...

  6. 【教程】青少年CTF机器人使用教程

    前言 本期教程适用于版本号为2.0.1-Beta的青少年CTF机器人,其他版本可能与当前版本不同. 由于之前版本的机器人重构,所以我们细化了本次的机器人逻辑,并且对机器人的功能进行了一些升级. 机器人 ...

  7. C++欧几里得算法求最大公约数和最小公倍数

    定义 最大公约数即为 Greatest Common Divisor,常缩写为 gcd. 一组整数的公约数,是指同时是这组数中每一个数的约数的数. 一组整数的最大公约数,是指所有公约数里面最大的一个. ...

  8. 1Nginx基础及编译安装

    1Nginx基础 1.Nginx概述 Nginx 功能介绍 Nginx(发音为"engine-x")是一个开源的高性能 HTTP和反向代理服务器.它具有以下功能: 1.静态文件服务 ...

  9. 《SQL与数据库基础》05. SQL-DCL

    目录 DCL 用户管理 权限控制 本文以 MySQL 为例 DCL 用户管理 查询有哪些用户: 1. USE mysql; SELECT * FROM user; 2. SELECT * FROM m ...

  10. PHP写一个 Api接口需要注意哪些?考虑哪些?

    随着互联网的飞速发展,前后端分离的开发模式越来越流行.编写一个稳定.可靠和易于使用的 API 接口是现代互联网应用程序的关键.本文将介绍在使用 thinkphp6 框架开发 API 接口时需要注意的要 ...