链接:https://codeforces.com/problemset/problem/1734/E
题意,给定n,b[1~n],求一个nn矩阵,满足a[i][i]=b[i],且对于r1<r2,c1<c2,a[r1][c1]+a[r2][c2]!=a[r1][c2]+a[r2][c1](mod n). n<=350,保证n为质数。
这个式子不好切入,进行变形:a[r1][c1]-a[r1][c2]!=a[r2][c1]-a[r2][c2]%n , a[r1][c1]-a[r2][c1]!=a[r1][c2]-a[r2][c2]%n.
即任意两行(列)对应两数差值不等,对整体即为p1,p2,a[i][p1]-a[i][p2](1<=i<=n)遍历n的完全剩余系,考虑构造方案,经尝试,发现只需对第i列使得第j+1数与第j数差值%n下为i-1. 对于每个b[i],平移序列即可。
证明:对于任意两列,显然差值分别为(c1-1)d,(c2-1)d,而n为素数,故(c1-1)d-(c2-1)*d=0 mod n 当且仅当n |c1-c2 .显然不可能。对于任意两行,对应位置差值易知遍历完系,故成立。
代码:
#define int long long
using namespace std;
const int N=3e5+100;
int b[400],g[400][400];
signed main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=i;cnt<n;cnt++,j=j%n+1)
{
g[i][j]=(b[i]+cnt*(i-1))%n;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<g[i][j]<<" ";
cout<<endl;
}
}
标签:r1,r2,int,Codeforces,400,c2,Div,c1,822
From: https://www.cnblogs.com/wjhqwq/p/17066846.html