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;
}
posted @ 2024-06-11 15:02  Creeper_l  阅读(1)  评论(0编辑  收藏  举报