codeforces Round #678 (Div. 2) 1436B Prime Square

题目链接

在这里插入图片描述

题目翻译:

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;
}
总结:

不要悲伤,不要抑郁,前方的道路依旧光明…

猜你喜欢

转载自blog.csdn.net/lmmmmmmmmmmmmmmm/article/details/109288676