题意简述
构造一个r行c列的矩阵,r,c<=500,满足:
不存在1<=i<=r,1<=j<=c,使得第i行所有数的gcd=第j列所有数的gcd(即:行,列gcd两两不同)多解输出任意一个。无解输出0。
思路框架
- 只有1x1的矩阵是无解的
- r=1的情况,显然只要令矩阵为[2,3,4…c+1]即珂。c=1同理。
- 别的情况,令第 行的 为 ,第 列的 为 即珂。这样行,列的 正好是 ,完美而潇洒。
具体思路
思考一个问题:如何令第 行的 为 ,第 列的 位 ?
那很简单,拿行举例:第 行的 为 ,那就让每个数都是i乘上一个东西即珂。乘上的东西要互质。
如何保证互质呢?我们发现,此时 ,而连续的两个(或以上)个正整数之间, 肯定是 。所以我们只要让第 行为 个连续正整数即珂。列同理。
稍加思索,我们令第 行第 列为: 。这样,对于任意的 ,第 行所有数都是 乘上 个连续的正整数;对于任意的 ,第 列所有数都是 乘上 个连续的正整数。满足条件。
代码
#include <bits/stdc++.h>
using namespace std;
namespace Flandre_Scarlet
{
#define N 1333
#define F(i,l,r) for(int i=l;i<=r;++i)
#define D(i,r,l) for(int i=r;i>=l;--i)
#define Fs(i,l,r,c) for(int i=l;i<=r;c)
#define Ds(i,r,l,c) for(int i=r;i>=l;c)
#define MEM(x,a) memset(x,a,sizeof(x))
#define FK(x) MEM(x,0)
#define Tra(i,u) for(int i=G.Start(u),__v=G.To(i);~i;i=G.Next(i),__v=G.To(i))
#define p_b push_back
#define sz(a) ((int)a.size())
#define iter(a,p) (a.begin()+p)
void R1(int &x)
{
x=0;char c=getchar();int f=1;
while(c<'0' or c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0' and c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
x=(f==1)?x:-x;
}
int a[N][N];
int r,c;
void Input()
{
R1(r),R1(c);
}
void Soviet()
{
if (r==1 and c==1) {return (void)puts("0");}
if (r==1) {F(i,1,c) printf("%d ",i+1);return;}
if (c==1) {F(i,1,r) printf("%d ",i+1);return;}
F(i,1,r) F(j,1,c) a[i][j]=i*(j+r);
F(i,1,r) F(j,1,c) printf("%d%c",a[i][j]," \n"[j==c]);
}
#define Flan void
Flan IsMyWife()
{
Input();
Soviet();
}
}
int main()
{
Flandre_Scarlet::IsMyWife();
getchar();getchar();
return 0;
}