Codeforces Global Round 6 C - Diverse Matrix(贪心+构造)

Codeforces Global Round 6 C - Diverse Matrix(贪心+构造)_第1张图片
Codeforces Global Round 6 C - Diverse Matrix(贪心+构造)_第2张图片
题意:构造一个n*m矩阵,是矩阵所有的行,列的gcd的最大值最小。
思路:由于每行每列所产生的gcd互不相同,则最好的方案是不是就是gcd的1到n+m?那么我们贪心来构造,把最长的那一行/列构造成gcd为1,然后另一列/行构造成gcd为2(也就是2的倍数),例如行为2,列为5,那么我们就构造成:
2 3 5 6 7
4 ????
?号这个地方的话,就让行列两两相乘就行。有点地方要格外注意,就是第一行2 3 5的时候由于5这个时候已经大于4了(第一列的最大数),那么往后只要加1就行了。

#include 
using namespace std;
const int maxn=5e2+1;
typedef long long ll;
int r[maxn],c[maxn],ans[maxn][maxn],a,b;
int main()
{
	scanf("%d %d",&a,&b);
	if(a==1&&b==1) {
		printf("0\n");return 0;
	}
	ans[1][1]=2,ans[1][2]=3;
		for(int i=3;i<=b;++i) ans[1][i]=ans[1][i-1]+2;
		for(int i=2;i<=a;++i) ans[i][1]=ans[i-1][1]+2;
	if(a==1)
	{
		for(int i=1;i<=b;++i) printf("%d ",i+1);
		return 0;
	}
	if(b==1)
	{
		for(int i=1;i<=a;++i) printf("%d\n",i+1);
		return 0;
	}
	if(a>=b)
	{
		ans[1][1]=2;ans[2][1]=3;
		for(int i=2;i<=b;++i) ans[1][i]=ans[1][i-1]+2;;
		int t=ans[1][b];
		for(int i=3;i<=a;++i)
		ans[i][1]=ans[i-1][1]+(ans[i-1][1]>t?1:2);
	}
	else {
		ans[1][1]=2;ans[1][2]=3;
		for(int i=2;i<=a;++i) ans[i][1]=ans[i-1][1]+2;
		int t=ans[a][1];
		for(int i=3;i<=b;++i)
		ans[1][i]=ans[1][i-1]+(ans[1][i-1]>t?1:2);
	}
		for(int i=2;i<=a;++i)
	for(int j=2;j<=b;++j)
	ans[i][j]=ans[1][j]*ans[i][1];
	for(int i=1;i<=a;++i)
	for(int j=1;j<=b;++j)
	printf("%d%s",ans[i][j],(j==b)?"\n":" ");
}

你可能感兴趣的:(贪心)