CF1734E Rectangular Congruence 题解
题意:你需要构造一个 \(n \times n\) 的矩阵(\(n\) 是质数),对角线的值已经给定。满足:对于 \(1 \le x < p \le n,1 \le y < q \le n\),\(a_{x,y}+a_{p,q} \not\equiv a_{x,q}+a_{p,y} \pmod{n}\)。
首先有一个 Basic Trick:对于一个质数 \(n\),若 \(i \not\equiv j \pmod{n},k \not\equiv 0 \pmod{n}\),则 \(ik \not\equiv jk \pmod{n}\)。
我们考虑将原式变形为:\(a_{x,q}-a_{x,y} \not\equiv a_{p,q}-a_{p,y} \pmod{n}\)。那如何联系到上面的结论呢?会发现如果第 \(i\) 行满足两两相邻的数之差为 \(i\)。那么原式就变为了 \(x(q-y) \not\equiv p(q-y) \pmod{n}\),这是恒成立的。所以构造方案就有了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 360;
int n,a[MAXN][MAXN],b[MAXN];
signed main() {
cin >> n;
for(int i = 1;i <= n;i++) cin >> b[i];
for(int i = 1;i <= n;i++) {
a[i][i] = b[i];
for(int j = i - 1;j >= 1;j--)
a[i][j] = (a[i][j + 1] + i) % n;
for(int j = i + 1;j <= n;j++)
a[i][j] = (a[i][j - 1] - i + n) % n;
}
for(int i = 1;i <= n;i++,puts(""))
for(int j = 1;j <= n;j++) cout << a[i][j] << " ";
return 0;
}