中等- 时间限制:1000MS 内存限制:128MB 分数:100 OI排行榜得分:16(0.1*分数+2*难度)
二维数组 简单模拟 埃筛和欧筛 AI编程素养集训课
描述
把前 n^2 个素数从左上角开始按右、下、左、上、右、下、左、上……的顺序填入 n×n 的方阵就得到了蛇形素数方阵。以下是 n=4 和 n=5 的蛇形素数方阵:
给出 n,你的任务是求出 n×n 的蛇形素数方阵,并输出其中某个方格中的数值。
素数,又称质数,是指除 1 和其自身之外,没有其他约数的大于 1 的正整数。
输入描述
输入一行三个正整数 n,x,y,整数之间使用空格分隔。
输出描述
输出一行一个整数,表示 n×n 蛇形素数方阵第 x 行第 y 列中的数字。
样例输入 1
5 2 4
样例输出 1
67
提示
数据范围与提示:
所有数据满足 1≤x,y≤n≤20。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int MAXSIZE = 1e5+10;
int prime[MAXSIZE],p_cnt=0;
bool flag[MAXSIZE];
int a[25][25];
int main(){
for(int i=2;i<MAXSIZE;i++){
if(!flag[i]) prime[++p_cnt] = i;
for(int j=1;j<=p_cnt && i*prime[j]<MAXSIZE;j++){
flag[i*prime[j]] = 1;
if(i%prime[j]==0) break;
}
}
int n,x,y;
cin>>n>>x>>y;
int row = 1,col = 1,k = 1;
a[row][col] = k++;
while(k<=n*n){
while(col<=n-1 && !a[row][col+1]) a[row][++col]=k++;
while(row<=n-1 && !a[row+1][col]) a[++row][col]=k++;
while(col-1>0 && !a[row][col-1]) a[row][--col]=k++;
while(row-1>0 && !a[row-1][col]) a[--row][col]=k++;
}
cout<<prime[a[x][y]];
return 0;
}