首页 > 其他分享 >题解 P9326

题解 P9326

时间:2023-08-02 19:24:07浏览次数:39  
标签:字符 int 题解 lt P9326 cdots Sigma 回文

前言

数学符号约定

\(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\) 的情况下怎么填。考虑让我们的回文串填的暴力一点,即全都填一个字符,这个时候我们预期达到的效果如图所示:

pPPKnVx.png

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

对于第 \(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);
	}
}

标签:字符,int,题解,lt,P9326,cdots,Sigma,回文
From: https://www.cnblogs.com/larry76/p/17601548.html

相关文章

  • 题解
    大力相应teacher要求。正难则反,考虑求不合法的三元组的数量。对于一个不合法的三元组,可以发现条件等价于三元组中有一个点出度为2。记\(m\)次操作后每个点出度为\(d_i\),答案就是\(\dbinom{n}{3}-\sum\limits_{i=1}^n\dbinom{d_i}{2}\)。那么怎么统计?回忆\(\mathcal{O}(......
  • Lua script attempted to access a non local key in a cluster node 问题解决
    一、问题描述最近优化公司需要对不同的业务系统的缓存工具提供一个标准化的解决方案。各个业务系统将缓存数据通过map结构进行存储,然后在缓存系统中将这些map获取出来,然后保存在redis数据库中。技术经理想到的最好解决方案是将map集合直接存储在redis的hash表中。但是要求对hash......
  • CF1468N 题解
    洛谷链接&CF链接题目简述共有\(T\)组数据,对于每组数据:有三个桶,五种垃圾,每个桶有固定的容量。前三种垃圾分别放入三种桶中,第四种垃圾可以放进\(1,3\)桶中,第五种垃圾可以放进\(2,3\)桶中。问题:对于给定的桶容量和垃圾量,请问垃圾是否可以全部放入桶中?思路简单贪心题。......
  • CF479C 题解
    洛谷链接&CF链接题目简述一个人想要安排期末考试的时间。有\(n\)场考试,每场考试有两个时间\(x_i,y_i\),一个是老师规定的时间,另外一个是他与老师商量好的考试时间。如果错过了,那就只能按照原来的考试时间考试。规定:只能按照原定考试的日期顺序进行考试的情况下,输出考完试......
  • 饭票 题解
    1.题意简述某天小\(x\)去食堂吃饭,手里有\(n\)种饭票,面值分别为\(A_1~A_n\),数量分别为\(C_1~C_n\)请你计算小\(x\)的饭票能组成多少在\([1,m]\)区间内的面值。2.样例解释3101242118样例中,我们有两张一元,一张两元和一张四元,可以凑出\(1\)到\(8\)元中所......
  • 【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路
    Link很简单的一道图论题。要在一个有向图上找一条\(s\)到\(t\)的最短路,要求这条路径上的所有点都满足:该点的所有出边所连点都能到达终点\(t\)。看上去很乱,我们简单分解一下,先在所有点中找到与终点有路径的点集\(A\)进行标记,再再所有点中找到其所有出边所连点都被打上标......
  • 国标GB28181视频平台LntonGBS国标平台调用快照接口,未能正常返回快照图片的问题解决方
    LntonGBS国标视频云服务支持设备/平台通过国标GB28181协议注册接入,可实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。LntonGBS平台便捷、丰富、灵活、可拓展的视频能力,已经使其成为当前安防市场的主流需求视频平台,并且已经在大量的项目中落地......
  • 【题解】HDOJ 7329 [2023杭电多校] Touhou Red Red Blue
    题目传送门:HDOJ7329[2023杭电多校]TouhouRedRedBlue题意有两个口袋(口袋容量为1,初始均为空),有若干个UFO按顺序来到你的面前,每个UFO有一个颜色(GRB),你可以选择扔掉它或者把它装进口袋中,如果口袋1空着必须装进口袋1;如果口袋都满了,算上面前的UFO共有三个,有如下三种情况:如......
  • NOI2023 题解
    打的太shaber了,于是补补题。D1T1扫描线。首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的。首先考虑只被一种操作覆盖到的,这很简单,直接上个区间颜色段推平就好了,顺便去了个重。接下来是有被斜线覆盖到的,这样的点数为\(O(nk)\)......
  • 因MySQL数据库无法启动导致LiteCVR视频平台也无法启动的问题解决教程
    近期呢,我们的数据人员发现有时候MySQL数据库无法启动会导致LiteCVR视频平台也无法启动,所以接下来我们将为大家讲解遇见这种问题时的解决教程。但是在这之前值得一提的一件事那就是我们的LiteCVR平台默认的数据库是SQLite,不过用户可以根据自己的使用需求选择将数据库切换为MySQL。具......