CF1734E Rectangular Congruence 题解

· · 题解

可能更好的阅读体验

题目传送门 to luogu

为什么只有 VP 才会遇到这种简单 E。

题目大意

给定一个质数 n 和长度为 n 的序列 b,要求构造一个 n\times n 矩阵 a,满足所有 r_1,r_2,c_1,c_21\le r_1<r_2\le n1\le c_1<c_2\le n),有 a_{r_1,c_1}+a_{r_2,c_2}\not\equiv a_{r_1,c_2}+a_{r_2,c_1}\pmod n,同时 a_{i,i}=b_i
数据范围:2\le n\le 350

题目解析

对原式移项,得到 a_{r_1,c_1}-a_{r_1,c_2}\not\equiv a_{r_2,c_2}-a_{r_2,c_2}\pmod n
也就是说,对于任意的 1\le l<r\le n(a_{l,i}-a_{r,i})\bmod n 两两不同,换句话说,构成一个 0\sim n-1 的一个排列。
注意到我们如果给一行都加上一个数不会影响 a_{l,i}-a_{r,i},所以 a_{i,i}=b_i 的限制可以忽略,只需要最后整行加上一个数即可。

接下来考虑如何得到一个任意的合法的 a
首先假设 a_{2,i}-a_{1,i}=i,然后考虑怎么构造 a_{3,i}
我们发现直接让 a_{3,i}-a_{2,i}=i 即可。
换句话说可以直接,a_{i,j}=i\times j\bmod n
我们来证明这样是正确的。

换句话说,对于任意的 0\le x<nxy\bmod n0\le y<n)两两不同。
使用反证法,假设 0\le i<j<nxi\equiv xj\pmod n
发现因为 n 是质数,\gcd(x,n)=1,所以 i\equiv j\pmod n,得到 i=j,矛盾,所以假设不成立,证毕。(类似于欧拉定理证明里的一步)

最后为了让 a_{i,i}=b_i,所以得到 a_{i,j} 的通项:

a_{i,j}=(i\times j-i\times i+b_i)\bmod n
int n,b[maxn];
int main(){
    n=read(); int i,j; for(i=1;i<=n;i++) b[i]=read();
    for(i=1;i<=n;i++) for(j=1;j<=n;j++) print((i*j-i*i%n+b[i]+n)%n),pc(" \n"[j==n]);
    return 0;
}