Codeforces 1266C Diverse Matrix 题解

博客观赏效果更佳

题意简述

构造一个r行c列的矩阵,r,c<=500,满足:
不存在1<=i<=r,1<=j<=c,使得第i行所有数的gcd=第j列所有数的gcd(即:行,列gcd两两不同)多解输出任意一个。无解输出0。

思路框架

  1. 只有1x1的矩阵是无解的
  2. r=1的情况,显然只要令矩阵为[2,3,4…c+1]即珂。c=1同理。
  3. 别的情况,令第 i i i行的 g c d gcd gcd i i i,第 i i i列的 g c d gcd gcd r + i r+i r+i即珂。这样行,列的 g c d gcd gcd正好是 1 , 2 , 3... r + c 1,2,3...r+c 1,2,3...r+c,完美而潇洒。

具体思路

思考一个问题:如何令第 i i i行的 g c d gcd gcd i i i,第 i i i列的 g c d gcd gcd r + i r+i r+i

那很简单,拿行举例:第 i i i行的 g c d gcd gcd i i i,那就让每个数都是i乘上一个东西即珂。乘上的东西要互质。

如何保证互质呢?我们发现,此时 r , c > = 2 r,c>=2 r,c>=2,而连续的两个(或以上)个正整数之间, g c d gcd gcd肯定是 1 1 1。所以我们只要让第 i i i行为 c c c个连续正整数即珂。列同理。

稍加思索,我们令第 i i i行第 j j j列为: i ∗ ( j + r ) i*(j+r) i(j+r)。这样,对于任意的 i i i,第 i i i行所有数都是 i i i乘上 c c c个连续的正整数;对于任意的 i i i,第 I I I列所有数都是 i i i乘上 r r r个连续的正整数。满足条件。

代码

#include 
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;
}

你可能感兴趣的:(Codeforces 1266C Diverse Matrix 题解)