PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes相关的知识,希望对你有一定的参考价值。
思路:用筛除法打素数表(与之相对的是枚举加逐个判断)是降低时间复杂度的第一个点,第二个点是运用上数学技巧,给定了等差数列的范围(2-MAX),给定了个数,那么最大的等差是可以求出的。循环的第一层从最大等差开始,倒序向后枚举;循环的第二层从最后一个质数开始,倒序向后枚举;循环的第三层用来看以当前的数列最后一个数和方差,最多能数到多少个素数,进行计数。一旦计数符合要求,那当前数列就是我们要找的。
注意特例:等差数列只有一个数的情况和没有符合等差数列的情况做同样处理。这里我封装了一个noAP()函数。
AC代码
#include<string>
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100000;
bool p[maxn+1] = {0}; //0表示是素数
int prime[maxn];//用来存放素数
int pNum = 0;//prime中的素数个数
void getPrime(int MAX){
for(int i=2;i<=MAX;i++){
if(p[i]==false){
prime[pNum++] = i;
for(int j=i+i;j<=MAX;j+=i){
p[j] = 1;
}
}
}
}
int n,MAX;
void noAP(){
for(int i=MAX;i>=2;i--){
if(p[i]==0){
printf("%d\\n",i);
return;
}
}
}
int main(){
scanf("%d %d",&n,&MAX);
getPrime(MAX); //这样prime数组就会存放2到MAX间的所有素数
if(n==1){
noAP();
return 0;
}
int bigDif = (MAX-2)/(n-1);
int begin;
int maxDif;
bool hasFound = false;
for(int dif = bigDif;dif>0;dif--){
if(hasFound)break;
for(int i=pNum-1;i>0;i--){
int cnt = 1;
int next = prime[i]-dif;
while(p[next]==0&&next>=2){
cnt++;
next -= dif;
}
if(cnt>=n){
begin = prime[i];
maxDif = dif;
hasFound = true;
break;
}
}
}
if(hasFound == 0){
noAP();
return 0;
}
for(int i=n-1;i>=0;i--){
printf("%d",begin-maxDif*i);
if(i!=0)printf(" ");
}
return 0;
}
以上是关于PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes的主要内容,如果未能解决你的问题,请参考以下文章
PAT(甲级)2021年春季考试 7-4 Recycling of Shared Bicycles
PAT(甲级)2021年春季考试 7-3 Structure of Max-Heap
PAT(甲级)2019年春季考试 7-2 Anniversary