[构造] aw3679. 素数矩阵(构造+思维)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[构造] aw3679. 素数矩阵(构造+思维)相关的知识,希望对你有一定的参考价值。
1. 题目来源
链接:3679. 素数矩阵
2. 题目解析
构造性的一道题,方案很多。
下面是我的解法和思路:
首先这是个方阵,且要求行、列和均是素数,所以可以考虑将行列和搞成一样的数字,方便判断。
可以将整个方阵先初始化为全 1 的方阵:
- 如果
n
是素数,那么行列和都是n
,直接打印即可。 - 如果
n
是合数,那么我们只需要将主对角线上的数统一改变一下就行了。行列和是素数,假定为y
,则y-(n-1)
就是主对角线上的数,且需要保证该数是合数即可。
更加精妙的方法:
每行每列填两个 1 就行了,属实妙啊!
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n;
int a[N][N];
void print() {
for (int i = 0; i < n; i ++ ) {
for (int j = 0; j < n; j ++ )
printf("%d ", a[i][j]);
puts("");
}
}
bool check(int n) {
for (int i = 2; i <= n / i; i ++ )
if (n % i == 0)
return false;
return true;
}
int main() {
int T;
scanf("%d", &T);
while (T -- ) {
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
for (int j = 0; j < n; j ++ )
a[i][j] = 1;
if (check(n)) print(); // 素数直接打印
else {
int t;
for (int i = n; ; i ++ ) { // 找到行列和最小的素数,且要求填的位置是合数
t = i - (n - 1);
if (!check(t) && check(i)) break;
}
for (int i = 0; i < n; i ++ ) a[i][i] = t;
print();
}
}
return 0;
}
妙啊,写法:
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
scanf("%d", &T);
while (T -- ) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) {
for (int j = 0; j < n; j ++ ) {
if (i == j || i == (j + 1) % n) printf("%d ", 1);
else printf("%d ", 0);
}
puts("");
}
}
return 0;
}
以上是关于[构造] aw3679. 素数矩阵(构造+思维)的主要内容,如果未能解决你的问题,请参考以下文章
[构造] aw3762. 二进制矩阵(困难模拟+分类讨论+简化代码+思维)