题目

构造一个n*n(n<=1e3)的矩阵,恰用到1到n*n这n*n个数,

使得相邻两项之和不是质数

思路来源

官方题解/zhoukangyang代码/SSerxhs代码/Heltion代码

题解

自己虽然搞过去了,但是很复杂,多学学别人怎么写的

首先想到是奇数分一堆偶数分一堆,特判n=3后,分奇偶直接搞也可做

简洁的做法是特判n=3,4,5,然后n>=6用奇数和偶数中3的倍数做两堆数的分隔

此时奇数里3的倍数,偶数里3的倍数已经能独占一行了

代码1

中规中矩,n=3,4,5构造,n>=6按规则排一下序,很简洁

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)
#define ll long long
#define ull unsigned long long
#define vi vector <int>
#define sz(a) ((int) (a).size())
#define me(f, x) memset(f, x, sizeof(f))
using namespace std;
const int N = 1e6 + 7, mod = 998244353, inv3 = (mod + 1) / 3;
int n, m, w[N], ord[N];
int main () {ios :: sync_with_stdio(false);cin.tie (0); cout.tie (0);cin >> n;if(n == 3) {cout << "5 4 8\n";cout << "3 6 2\n";cout << "1 9 7\n";return 0;}if(n == 4) {cout << "15 11 16 12\n";cout << "13 3 6 9\n";cout << "14 7 8 1\n";cout << "4 2 10 5\n";return 0;}if(n == 5) {cout << "1 3 5 7 9\n";cout << "11 13 15 17 19\n";cout << "23 25 21 4 14\n";cout << "10 8 12 24 22\n";cout << "18 20 2 16 6\n";return 0;}L(i, 1, n * n) {if(i % 2 == 0) w[i] = 1e9 - (i % 3 == 0);else w[i] = (i % 3 == 0);ord[i] = i;}sort(ord + 1, ord + n * n + 1, [&] (int x, int y) {return w[x] < w[y];});L(i, 1, n * n) cout << ord[i] << " \n"[i % n == 0];return 0;
}
/*
6 2 5
5 2 3 1 4 6
*/

代码2

n=3,4,5直接暴力随机置换至有解

//这回只花了114514min就打完了。
//真好。记得多手造几组。ACM拍什么拍。
#include "bits/stdc++.h"
using namespace std;
template<typename typC,typename typD> istream &operator>>(istream &cin,pair<typC,typD> &a) { return cin>>a.first>>a.second; }
template<typename typC> istream &operator>>(istream &cin,vector<typC> &a) { for (auto &x:a) cin>>x; return cin; }
template<typename typC,typename typD> ostream &operator<<(ostream &cout,const pair<typC,typD> &a) { return cout<<a.first<<' '<<a.second; }
template<typename typC,typename typD> ostream &operator<<(ostream &cout,const vector<pair<typC,typD>> &a) { for (auto &x:a) cout<<x<<'\n'; return cout; }
template<typename typC> ostream &operator<<(ostream &cout,const vector<typC> &a) { int n=a.size(); if (!n) return cout; cout<<a[0]; for (int i=1; i<n; i++) cout<<' '<<a[i]; return cout; }
template<typename typC> bool cmin(typC &x,const typC &y) { if (x>y) { x=y; return 1; } return 0; }
template<typename typC> bool cmax(typC &x,const typC &y) { if (x<y) { x=y; return 1; } return 0; }
#if !defined(ONLINE_JUDGE)&&defined(LOCAL)
#include "my_header\debug.h"
#else
#define dbg(...) ;
#define dbgn(...) ;
#endif
typedef unsigned int ui;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
// void inc(ui &x,const ui &y) { if ((x+=y)>=p) x-=p; }
// void dec(ui &x,const ui &y) { if ((x+=p-y)>=p) x-=p; }
namespace pr
{typedef long long ll;typedef __int128 lll;typedef pair<ll,int> pa;ll ksm(ll x,ll y,const ll p){ll r=1;while (y){if (y&1) r=(lll)r*x%p;x=(lll)x*x%p; y>>=1;}return r;}namespace miller{const int p[7]={2,3,5,7,11,61,24251};ll s,t;bool test(ll n,int p){if (p>=n) return 1;ll r=ksm(p,t,n),w;for (int j=0; j<s&&r!=1; j++){w=(lll)r*r%n;if (w==1&&r!=n-1) return 0;r=w;}return r==1;}bool prime(ll n){if (n<2||n==46'856'248'255'981ll) return 0;for (int i=0; i<7; ++i) if (n%p[i]==0) return n==p[i];s=__builtin_ctz(n-1); t=n-1>>s;for (int i=0; i<7; ++i) if (!test(n,p[i])) return 0;return 1;}}using miller::prime;mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());namespace rho{void nxt(ll &x,ll &y,ll &p) { x=((lll)x*x+y)%p; }ll find(ll n,ll C){ll l,r,d,p=1;l=rnd()%(n-2)+2,r=l;nxt(r,C,n);int cnt=0;while (l^r){p=(lll)p*llabs(l-r)%n;if (!p) return gcd(n,llabs(l-r));++cnt;if (cnt==127){cnt=0;d=gcd(llabs(l-r),n);if (d>1) return d;}nxt(l,C,n); nxt(r,C,n); nxt(r,C,n);}return gcd(n,p);}vector<pa> w;vector<ll> d;void dfs(ll n,int cnt){if (n==1) return;if (prime(n)) return w.emplace_back(n,cnt),void();ll p=n,C=rnd()%(n-1)+1;while (p==1||p==n) p=find(n,C++);int r=1; n/=p;while (n%p==0) n/=p,++r;dfs(p,r*cnt); dfs(n,cnt);}vector<pa> getw(ll n){w=vector<pa>(0); dfs(n,1);if (n==1) return w;sort(w.begin(),w.end());int i,j;for (i=1,j=0; i<w.size(); i++) if (w[i].first==w[j].first) w[j].second+=w[i].second; else w[++j]=w[i];w.resize(j+1);return w;}void dfss(int x,ll n){if (x==w.size()) return d.push_back(n),void();dfss(x+1,n);for (int i=1; i<=w[x].second; i++) dfss(x+1,n*=w[x].first);}vector<ll> getd(ll n){getw(n); d=vector<ll>(0); dfss(0,1);sort(d.begin(),d.end());return d;}}using rho::getw,rho::getd;using miller::prime;
}
using pr::getw,pr::getd;
const int N=1e6+5;
int main()
{ios::sync_with_stdio(0); cin.tie(0);cout<<setiosflags(ios::fixed)<<setprecision(15);int n,i,j,k;cin>>n;int m=n*n;vector a(n,vector(n,0));if (n>=6){for (i=j=0,k=1; k<=m; k+=2) if (k%3){a[i][j]=k;if (++j==n) ++i,j=0;}for (k=1; k<=m; k+=2) if (k%3==0){a[i][j]=k;if (++j==n) ++i,j=0;}for (k=2; k<=m; k+=2) if (k%3==0){a[i][j]=k;if (++j==n) ++i,j=0;}for (k=2; k<=m; k+=2) if (k%3){a[i][j]=k;if (++j==n) ++i,j=0;}}else{for (i=j=0,k=1; k<=m; k+=2) if (k%3){a[i][j]=k;if (++j==n) ++i,j=0;}for (k=1; k<=m; k+=2) if (k%3==0){a[i][j]=k;if (++j==n) ++i,j=0;}for (k=2; k<=m; k+=2) if (k%3==0){a[i][j]=k;if (++j==n) ++i,j=0;}for (k=2; k<=m; k+=2) if (k%3){a[i][j]=k;if (++j==n) ++i,j=0;}mt19937 rnd(345);while (1){bool flg=0;for (i=0; i<n; i++) for (j=0; j<n; j++) if (j+1<n&&pr::prime(a[i][j]+a[i][j+1])||i+1<n&&pr::prime(a[i][j]+a[i+1][j])){swap(a[i][j],a[rnd()%n][rnd()%n]);flg=1;}if (!flg) break;}}for (auto &v:a) cout<<v<<'\n';/*for (i=0; i<n; i++) for (j=0; j<n; j++){dbg(i,j);if (j+1<n) assert(!pr::prime(a[i][j]+a[i][j+1]));if (i+1<n) assert(!pr::prime(a[i][j]+a[i+1][j]));}*/
}

代码3

暴力:n为奇数,把中心一填1 7 8 2一填,然后解决一行分界线;n为偶数,解决一行分界线

奇 1 奇

奇 7  8

偶 2 偶

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int p(int n) {for (int i = 2; i * i <= n; i += 1)if (n % i == 0)return 1;return 0;
}
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout << fixed << setprecision(20);int N;cin >> N;vector A(N, vector<int>(N));array<set<int>, 2> S;for (int i = 1; i <= N * N; i += 1)S[i % 2].insert(i);vector<pair<int, int>> vp;if (N % 2 == 1) {A[N / 2][N / 2] = 7;A[N / 2][N / 2 + 1] = 8;A[N / 2 + 1][N / 2] = 2;A[N / 2 - 1][N / 2 + 1] = 1;S[1].erase(1);S[1].erase(7);S[0].erase(2);S[0].erase(8);for (int i = 0; i < N / 2; i += 1)vp.emplace_back(N / 2, i);for (int i = N / 2 + 2; i < N; i += 1)vp.emplace_back(N / 2 - 1, i);}else for (int i = 0; i < N; i += 1)vp.emplace_back(N / 2 - 1, i);int n = N * N * 2;for (auto [x, y] : vp) {int si = -1, sj = -1;for (int i : S[0])if (si == -1) {for (int j : S[1])if (p(i + j)) {si = i;sj = j;break;}}else break;S[0].erase(si);S[1].erase(sj);A[x][y] = sj;A[x + 1][y] = si;}for (auto& Ai : A) {for (int& Aij : Ai) {if (Aij == 0) {int k = not S[1].empty();Aij = *S[k].begin();S[k].erase(Aij);}cout << Aij << " ";}cout << "\n";}
}

AtCoder Regular Contest 149 C.Avoid Prime Sum(构造题,补写法)相关推荐

  1. AtCoder题解——AtCoder Regular Contest 107——B - Quadruple

    题目相关 题目链接 AtCoder Regular Contest 107 B 题,https://atcoder.jp/contests/arc107/tasks/arc107_b. Problem ...

  2. AtCoder Regular Contest 065

    AtCoder Regular Contest 065 C - Daydream Score : 300300300 points 倒着来就行了,正着来会产生歧义匹配,dreamer,dreamdre ...

  3. AtCoder Regular Contest 100 D - Equal Cut 思维 + 前缀和

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,你要将其分成四份,让这四份中和的最大值−-−最小值最小,输出这个最小值. n≤2e5,ai≤1e9n\le2e5,a_i\le1e9n≤2 ...

  4. AtCoder Regular Contest 100 E - Or Plus Max Sos dp

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为2n2^n2n的数组,让你对于所有的1≤k≤2n−11\le k\le 2^n-11≤k≤2n−1求最大的ai+aj,0≤i<j≤2n−1 ...

  5. AtCoder Regular Contest 061 E - Snuke‘s Subway Trip(建图 + dijkstra最短路 / 0/1bfs / 并查集)

    AtCoder Regular Contest 061 E - Snuke's Subway Trip problem 洛谷翻译 my idea 最近一直在做网络流,所以一读这题后,我就想到了最小费用 ...

  6. NOMURA Programming Contest 2021(AtCoder Regular Contest 121)

    文章目录 A - 2nd Greatest Distance B - RGB Matching C - Odd Even Sort D - 1 or 2 E - Directed Tree F - L ...

  7. [AtCoder Regular Contest 125] A-F全题解

    文章目录 A - Dial Up B - Squares C - LIS to Original Sequence D - Unique Subsequence E - Snack F - Tree ...

  8. AtCoder Regular Contest 题解

    arc138 比赛传送门 A 值域线段树动态开点 先读入k个数字,插入 然后读入剩下的数字x,查询比我小的最大下标,维护ans 如果答案ans大于等于n输出-1 #include<bits/st ...

  9. AtCoder Regular Contest 107 F - Sum of Abs(网络流最小割)

    题目链接 题意就是给定一个无向图,每个点有权值ai,bia_i,b_iai​,bi​,现在需要删去其中的一些点,其中删去一个点的花费为aia_iai​,删点后的图的分数为每一个联通块的分数之和,一个联 ...

最新文章

  1. Hinton获2021迪克森科学奖:他改变了AI,改变了世界
  2. 257. Binary Tree Paths
  3. 没有人会尊重弱者,把弱者当成朋友!人们永远追随强者,永远和强者结盟!
  4. Py之seaborn:seaborn库的简介、安装、使用方法之详细攻略
  5. Java环境配置(linux安装jdk8)
  6. 调试代码和解决问题的总体思路和 技术路线应该持有的心态
  7. 宁波Uber优步司机奖励政策(12月21日到12月27日)
  8. apk签名的重要性和方法
  9. 6. JavaScript String 对象
  10. 《涂抹Oracle—三思笔记之一步一步学Oracle》看书笔记(第一章)
  11. python 规则引擎 drools_Drools 规则引擎环境搭建
  12. 存储介质(sd卡,硬盘等)读写速度测试
  13. 为什么qq相册显示服务器数据错误,玩qq空间常遇到的问题及解决办法_qq空间
  14. Python语言程序设计基础_期末作品设计_答案_通识教育必修课程_上海师范大学
  15. opencv读取大恒相机
  16. 【v-on】一个元素绑定多个事件以及一个事件绑定多个函数的两种写法
  17. Ubuntu 编译 ZBar
  18. android extra_shortcut_icon,Android Shortcut操作(一)
  19. 卡特兰数列(Catalan )
  20. C与C++中二维数组的动态分配内存方法

热门文章

  1. php 数组 merge,php 数组合并array_merge与array_merge_recursive详解
  2. 利用JavaScript上传读取文件(附源代码)
  3. 入门pandas—字符串操作
  4. 第十三周CoreIDRAW
  5. 【我的Android进阶之旅】解决SDK升级到27.0.3遇到的GLIBC_2.14 not found、no acceptable C compiler found in $PATH等问题
  6. linux装系统基本分区,Linux基础——系统分区
  7. 布尔表达式和正则表达式_简化布尔表达式的实例
  8. Linux重定向用法详解
  9. Axure RP 资源整理
  10. 我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)