首页 > 其他分享 >ARC149C (构造)

ARC149C (构造)

时间:2024-04-01 18:22:56浏览次数:17  
标签:偶数 gg 奇数 long ARC149C 枚举 构造 边长

比较有意思的构造题,首先想到要使两个数相加为合数,可以让奇数加上奇数,偶数加上偶数,那么这样我们可以使一个数组的上半边全部为奇数,下半边全部为偶数。然后考虑临界。构造题我虽然不是特别会做,但我觉得一个很重要的就是避免过多的讨论,这样的话我们可以在这行枚举相邻两个数的和,然后上面递增排,相邻差为2,下面递减排,相邻差为2。然后对于奇偶分开判断。

对于边长为偶数的情况:然后枚举一个合数,然后枚举一个奇数和一个偶数,递增填即可,剩下随便填。
对于边长为奇数的情况:和上面一样,但是这样如果边长为奇数的时候中间会出现一个阶梯,所以还要枚举这个阶梯是否合法。

放下代码,有点细节,但实现起来花的时间好像没这么多

#include<bits/stdc++.h>
using namespace std;
long long n,gg,gg1,a[1005][1005],cnt1=1,cnt2=2;
bool vis[1000005];
bool check(long long x){
	for(long long i=2;i*i<=x;i++){
		if(x%i==0) return false;
	}
	return true;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 
	cin>>n;
	if(n%2==0){
		for(long long i=2*n+1;;i+=2){
			if(!check(i)){
				gg=i;
				break;
			}
		}
		gg-=(2*n-2);
		for(long long i=1;i+2*n-2<=n*n;i+=2){
			if((gg-i)+2*n-2<=n*n){
				gg1=gg-i;
				gg=i;
				break;
			}
		}
		for(long long i=1;i<=n;i++){
			a[n/2][i]=gg+i*2-2;//odd
			a[n/2+1][n-i+1]=gg1+i*2-2;//even
			vis[gg+i*2-2]=vis[gg1+(n-i)*2]=true;
		}
		for(long long i=1;i<=n/2-1;i++){
			for(long long j=1;j<=n;j++){
				while(vis[cnt1]){
					cnt1+=2;
				}
				vis[cnt1]=true;
				a[i][j]=cnt1;
			}
		}
		for(long long i=n/2+2;i<=n;i++){
			for(long long j=1;j<=n;j++){
				while(vis[cnt2]){
					cnt2+=2;
				}
				vis[cnt2]=true;
				a[i][j]=cnt2;
			}
		}
		for(long long i=1;i<=n;i++){
			for(long long j=1;j<=n;j++){
				cout<<a[i][j]<<" ";
			}
			cout<<"\n";
		}
	}else if(n==3){
		cout<<"1 3 9\n8 7 5\n6 2 4\n";
	}else{
		for(long long i=3;;i+=2){
			if(!check(i+2*n-2)&&!check(i+2*n)){
				gg=i;
				break;
			}
		}//gg
		//cout<<gg<<endl;
		for(long long i=1;i+2*n-2<=n*n;i+=2){
			if((gg-i)+2*n-2<=n*n){
				gg1=gg-i;
				gg=i;
				break;
			}
		}
		//cout<<gg<<" "<<gg1<<endl;
		for(long long i=1;i<=n/2;i++){
			a[n/2][i]=gg+2*i-2;
			vis[gg+2*i-2]=true;
		}for(long long i=n/2+1;i<=n;i++){
			a[n/2+1][i]=gg+2*i-2;
			vis[gg+2*i-2]=true;
		}for(long long i=1;i<=n/2+1;i++){
			a[n/2+2][n-i+1]=gg1+2*i-2;
			vis[gg1+2*i-2]=true;
		}for(long long i=n/2+2;i<=n;i++){
			a[n/2+1][n-i+1]=gg1+2*i-2;
			vis[gg1+2*i-2]=true;
		}
		for(long long i=1;i<=n/2;i++){
			for(long long j=1;j<=n;j++){
				if(a[i][j]==0){
					while(vis[cnt1]){
						cnt1+=2;
					}
					vis[cnt1]=true;
					a[i][j]=cnt1;
				}
			}
		}
		for(long long i=n/2+2;i<=n;i++){
			for(long long j=1;j<=n;j++){
				if(a[i][j]==0){
					while(vis[cnt2]){
						cnt2+=2;
					}
					vis[cnt2]=true;
					a[i][j]=cnt2;
				}
			}
		}
		for(long long i=1;i<=n;i++){
			for(long long j=1;j<=n;j++){
				cout<<a[i][j]<<" ";
			}
			cout<<"\n";
		}
	}
	
	
	return 0; 
}

标签:偶数,gg,奇数,long,ARC149C,枚举,构造,边长
From: https://www.cnblogs.com/wuhupai/p/18109105

相关文章

  • java的类,对象和构造方法
    学习目标:掌握类,对象和构造方法的创建和使用学习内容:Java中的类和对象构造方法Java中的类和对象:类和对象的定义类Java当中,类可以理解为某一类东西,比如在现实生活中,水果,蔬菜等等都属于类的定义。在编写代码时,主要使用的语句是publicclass+类名,例如这里创建水果类:......
  • Java-构造器详解
    构造器(Constructor)在Java中是一种特殊的方法,用于创建和初始化对象。它是类的一部分,并且与类名相同。构造器的主要目的是确保对象在创建时具有有效的状态。以下是构造器的一些关键知识点:构造器的声明构造器没有返回类型,连void也不写。它的名称必须与类名完全相同。public......
  • 线程创建方式、构造方法和线程属性
    欢迎各位!!!推荐PC端观看文章重点:学会五种线程的创造方式目录1.开启线程的五种方式2.线程的构造方法3.线程的属性及获取方法1.开启线程的五种方式创造线程的基本两步:(1)使用run方法记录线程要做的任务(2)使用线程的引用调用start开启线程1.1.继承Tread,重写runclassm......
  • 实例、构造函数、原型、原型对象、prototype、__proto__、原型链……
    学习原型链和原型对象,不需要说太多话,只需要给你看看几张图,你自然就懂了。prototype表示原型对象__proto__表示原型实例、构造函数和原型对象以error举例图中的error表示axios抛出的一个错误对象(实例)。宇宙的尽头是nullObject.prototype.__proto__===null......
  • 889. 根据前序和后序遍历构造二叉树
    给定两个整数数组,preorder和postorder,其中preorder是一个具有无重复值的二叉树的前序遍历,postorder是同一棵树的后序遍历,重构并返回二叉树。如果存在多个答案,您可以返回其中任何一个。https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-postorde......
  • C++复制构造函数、=运算符重载
    C++复制构造函数、=运算符重载#include<iostream>usingnamespacestd;classbase{private:intx,y;public:base():x(2),y(4){cout<<"basedefaultconstructor"<<endl;}base(intx,inty):x(x),y(y){cout<<"base......
  • 拷贝构造
    #include<iostream>usingnamespacestd;classMonster{public:Monster();Monster(char*name,inthp,floatspeed);~Monster();Monster(Monster&obj);Monster(Monster&obj1,intval);public:stringm_name;int......
  • 根据后序(前序)和中序构造二叉树(力扣105,106)
    文章目录题目前知怎样通过中序和前(后)序构造二叉树HashMap题解一、思路二、解题方法三、Code总结题目Problem:105.从前序与中序遍历序列构造二叉树Problem:106.从中序与后序遍历序列构造二叉树中后:给定两个整数数组inorder和postorder,其中inorder......
  • 【05每天十分钟,javase基础全搞定-构造方法】
    构造方法格式:[修饰符]类名(形参列表){}构造方法也叫构造器,用于对象的初始化。构造器的名称应与它所在的类的名称一致构造方法的返回值跟普通方法有区别,普通方法的那种返回值,构造方法没有,也不能用void修饰符构造方法通过new关键字调用!构造方法的返回值类型是这个类本身。(......
  • C++类的构造函数和析构函数
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.构造函数(Constructor)2.析构函数(Destructor):3.构造函数与析构函数的调用顺序:4.注意事项:5.示例总结1.构造函数(Constructor)**定义:**构造函数是一种特殊的成员函数,用于在创建对象时初始化......