题目链接
题目翻译:
Sasha喜欢研究不同的数学对象,比如魔术方形。但是Sasha知道已经有很多人研究过魔术方形,因此他不想继续学习它们。相反,他发明了新的方形——一个素数方形。
如果一个n×n的方形同时满足下面三个条件,那么就称其为素数方形:
- 方形中所有数字都是正整数且不大于105;
- 方形中不存在素数
- 每一行、每一列的数字和都是素数。
Sasha有一个整数n,要求你找出任意一个n×n的素数方形。Sasha确定存在这样的方形,所以请帮助他。
我的解题思路:
首先,我们要先找出这样一行数,所有数都是非素数,但和是素数。找到这样的一行数后,我们只需要依次将第一数放到最后一位,就可以组成题目要求的素数方形。像这样:
那么要怎样找到这样一行数呢?一开始先往简单了想,假设填入方形的数只有两种,且都是非素数。那就一开始都是1,然后判断和是否是素数,如果不是,就把其中一个1变成4,再判断,再继续下去,直到和是素数。然后开心地提交了,错了。发现有的数,即使所有的1都被换成4,和还是非素数。难道是思路错了?好在n的数据范围只有100,于是遍历了n的所有可能取值,发现当n取3的倍数,5的倍数的时候,我的方法是错的。于是将错就错,当n不是3的倍数时,将1变成4;当n既不是3的倍数又不是5的倍数时,将1变成6;其他情况将1变成8。这下总算是对了。
我的代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
int prime[210];
vector<int>v;
void init() {
prime[1]=1;
for(int i=2; i<=200; i++) {
if(prime[i]==0) {
for(int j=i+i; j<=200; j+=i) {
prime[j]=1;
}
}
}
}
int main() {
// freopen("1.txt","r",stdin);
init();
int t,n;
cin>>t;
while(t--) {
cin>>n;
v.clear();
int m=n,k=0,flag=0;
if(n%3!=0) {
flag=3;
while(prime[m]) {
m+=3;
k++;
}
} else if(n%5!=0) {
flag=5;
while(prime[m]) {
m+=5;
k++;
}
}else {
flag=7;
while(prime[m]) {
m+=7;
k++;
}
}
for(int i=0; i<n-k; i++) {
v.push_back(1);
}
for(int i=0; i<k; i++) {
v.push_back(flag+1);
}
for(int j=0; j<v.size(); j++) {
for(int k=j; k<v.size(); k++) {
if(k!=j) cout<<" ";
cout<<v[k];
}
for(int k=0; k<j; k++) {
cout<<" "<<v[k];
}
cout<<endl;
}
}
return 0;
}
官方的解题思路:
忽略了0也是非素数的事实…因此一行只要包含两个1,其他都是0就行了。
我的代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
const int N=110;
int a[N];
int main(){
// freopen("1.txt","r",stdin);
int t,n;
cin>>t;
while(t--){
cin>>n;
a[1]=1;a[2]=1;
for(int i=3;i<=n;i++) a[i]=0;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(j!=i) cout<<" ";
cout<<a[j];
}
for(int j=1;j<i;j++){
cout<<" "<<a[j];
}
cout<<endl;
}
}
return 0;
}
总结:
不要悲伤,不要抑郁,前方的道路依旧光明…