题意:给出长方形的长和宽,要让每一行(列)所有元素的平方和是平方数。
题解:暴力|随机
考虑长方形的分布规律。
假设2x2,设a为任意数,可以得到如下的解法:
a a
a a
继续扩容到3x3,发现奇数的行数或列数,相同数字无法保证,故可得如下解法:
a a b
a a b
b b d
若行列不同,则继续新增变量:
a a b
a a b
c c d
这样就得到了长方形的分布规律,暴力枚举或随机生成即可。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
int n, m, sq[1111111];
int main() {
for (int i = 1; i <= 1000; i++) sq[i * i] = 1;
int i, j, k, h, flag = 0;
scanf("%d%d", &n, &m);
for (i = 1; i <= 100; i++) {
for (j = 1; j <= 100; j++) {
for (k = 1; k <= 100; k++) {
for (h = 1; h <= 100; h++) {
int a = (m - 1) * i * i + j * j;
int b = (n - 1) * i * i + k * k;
int c = (m - 1) * k * k + h * h;
int d = (n - 1) * j * j + h * h;
if (sq[a] && sq[b] && sq[c] && sq[d]) {
flag = 1;
break;
}
}
if (flag) break;
}
if (flag) break;
}
if (flag) break;
}
for (int x = 1; x <= n - 1; x++) {
for (int y = 1; y <= m - 1; y++) {
printf("%d ", i);
}
printf("%d\n", j);
}
for (int x = 1; x <= m - 1; x++) printf("%d ", k);
printf("%d\n", h);
return 0;
}