【Codeforces】constructive marathon(div. 2) B. Rectangular Congruence | 构造题单

189 阅读2分钟

感谢 Misono_Mika 大佬创建的构造题单qwq!

题目链接

Problem - B - Codeforces

题目

image.png

题目大意

给出一个质数 n(n350)n(n\leq 350) 和一个长度为 nn 的序列 b1,b2,b3,...,bnb_1,b_2,b_3,...,b_n,保证对于 1in\forall 1 \leq i \leq n,有 0bi<n0\leq b_i< n,试构造一个 n×nn\times n 的矩阵 aa,满足:

  1. 对于 i,jn\forall i, j \leq n,有 0ai,j<n0\leq a_{i,j} \lt n
  2. 对于 1x1<x2n,1y1<y2n\forall 1\le x_1<x_2\leq n,\forall1\le y_1<y_2\le n,有 ax1,y1+ax2,y2≢ax1,y2+ax2,y1(modn)a_{x_1,y_1} +a_{x_2,y_2} \not\equiv a_{x_1,y_2} +a_{x_2,y_1}\pmod n
  3. 对于 in\forall i \leq n,有 ai,i=bia_{i,i} =b_i

思路

假设我们最终构建的矩阵如下图所示。

image.png

第二个条件其实是说对任意 ①②③④ 不重合的子矩阵,满足

+≢+(modn)①+④\not\equiv ②+③\pmod n

这个式子直接做没什么头绪,但是可以转化成

≢(modn)①-②\not\equiv ③-④\pmod n

这有什么用呢?
我们通过这步转化将条件二变成了“任意两列对应行相减之差对 nn 取余的结果互不相同”。

nn 取余一共有 nn 种不同的结果,我们被要求构建的矩阵也恰好 nn 行,所以我们可以构建出如下矩阵:

0000012n10242×(n1)modn0n12×(n1)modn(n1)2modn\begin{matrix} 0&0&0&\dots&0\\ 0&1&2&\dots&n-1\\ 0&2&4&\dots&2\times(n-1)\mod n\\ \vdots&\vdots&\vdots&\ddots&\vdots\\ 0&n-1&2\times(n-1)\mod n&\dots&(n-1)^2\mod n \end{matrix}

该矩阵满足条件 11,和条件 22

上面给出的矩阵显然满足条件 11,让我们证明它也满足条件 22

1x1<x2n,1y1<y2n\forall 1\le x_1<x_2\leq n,\forall1\le y_1<y_2\le n

我们可以得到

\begin{cases} a_{x_1,y_1}=(x_1-1)\times(y_1-1)\mod n\ a_{x_1,y_2}=(x_1-1)\times(y_2-1)\mod n\ a_{x_2,y_1}=(x_2-1)\times(y_1-1)\mod n\ a_{x_2,y_2}=(x_2-1)\times(y_2-1)\mod n \end{cases}

> > 所以 > $$ > \begin{aligned} &a_{x_1,y_1}-a_{x_1,y_2}\\ =&(x_1-1)\times(y_1-1)-(x_1-1)\times(y_2-1)\\ =&(x_1-1)\times(y_1-y_2)\\\\ &a_{x_2,y_1}-a_{x_2,y_2}\\ =&(x_2-1)\times(y_1-1)-(x_2-1)\times(y_2-1)\\ =&(x_2-1)\times(y_1-y_2)\\\\ \end{aligned}

如果 ax1,y1ax1,y2ax2,y1ax2,y2(modn)a_{x_1,y_1}-a_{x_1,y_2} \equiv a_{x_2,y_1}-a_{x_2,y_2}\pmod n

那么

\begin{aligned} (y_1-y_2)\times (x_1-1) &\equiv (x_2-1)\times(y_1-y_2)\pmod n\ (y_1-y_2)\times (x_1-x_2)&\equiv 0\pmod n \end{aligned}

> 即 > $$ \begin{aligned} (y_1-y_2)\times (x_1-x_2)\mod n&=0\\ ((y_1-y_2)\mod n)\times ((x_1-x_2)\mod n)\mod n&=0 \end{aligned}

显然有

0\lt (y_1-y_2)\mod n< n\ 0\lt (x_1-x_2)\mod n< n

>且 $n$ 为质数,所以 $(y_1-y_2)\times (x_1-x_2)$ 不是 $0$ 也不含因数 $n$,即 $(y_1-y_2)\times(x_1-x_2)\mod n=0$ 不可能成立。 > >与假设矛盾。 > >所以上述矩阵一定满足条件 $2$。 那么条件 $3$ 该怎么办呢?\ 容易发现如果我们有一个满足条件 $1$ 和条件 $2$ 的矩阵,让它的某一行中所有数同时增加 $x$ 再对 $n$ 取余,行内任意两个元素之差不会改变,所以新产生的矩阵也满足条件 $1$ 和条件 $2$。所以我们只需要让刚才构造的矩阵的第 $i$ 行所有数字都加上 $b_i-a_{i,i}$ 再对 $n$ 取余即可。 # 代码 ```cpp #include <stdio.h> #include <algorithm> #include <string.h> #include <iostream> #include <math.h> #include <map> #include <queue> #include <vector> #include <stdlib.h> #include <time.h> using namespace std; using LL=long long; const int N=351; int n,m,k,a[N],b; LL solve() { scanf("%d",&n); for (int i=1;i<=n;++i) { scanf("%d",&b); a[1]=0; for (int j=2;j<=n;++j) a[j]=(a[j-1]+i-1)%n; int dt=b-a[i]; for (int j=1;j<=n;++j) printf("%d ",(a[j]+n+dt)%n); printf("\n"); } return 0; } int main() { int T=1; while (T--) solve(); return 0; } ```