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(甲级)2017年春季考试

PAT(甲级)2021年春季考试 7-3 Structure of Max-Heap

PAT(甲级)2019年春季考试 7-2 Anniversary

PAT(甲级)2020年春季考试 7-2 The Judger

PAT(甲级)2020年春季考试 7-4 Replacement Selection