CF1734E Rectangular Congruence 题解
本题需要使用一些数论的特殊性质。
观察题目的第二个条件,如果我们不看第一个条件的话,可以构造出一个矩阵
赛后看了 CF 官方题解,里面阐述了一个定理:只要
现在我们再来考虑第一个条件。实现之前,先要明白——如果一个矩阵满足第二个条件,那么给其中的某一行或某一列中的全部元素都加上一个定值,那么第二条件仍然成立。
到这里解法已经呼之欲出了:对于
放代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int n; cin>>n;
vector a(n,vector<int>(n));
vector<int> b(n);
for(auto &i:b)cin>>i;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=i*j%n; // 构造初始矩阵
for(int i=0;i<n;i++){
int x=(b[i]-a[i][i]+n)%n; // 经典模加模
for(int j=0;j<n;j++)
(a[i][j]+=x)%=n; // 给每一个元素加上差值
}
for(int i=0;i<n;i++,cout<<'\n')
for(int j=0;j<n;j++)cout<<a[i][j]<<' ';
return 0;
}