算法刷题记录:素数中的等差数列

发布时间 2023-06-03 17:51:27作者: 想个昵称好难ABCD

题目链接

https://ac.nowcoder.com/acm/contest/19859/I

题目分析

模拟!模拟!模拟!下标要计算好。
自己的思路是放发现两个相等的差时,说明至少可以输出了,也就是合法情况,
然后用指针R往后扩展。我选择的R是闭区间的,即[L,R]的区间已经看过了,所以i可以直接从i+1开始看。
所以R赋值给i后,i自动加1。

AC代码

// Problem: 素数中的等差数列
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/19859/I
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <iostream>

using namespace std;

const int N = 100050;

int l, r;
int st[N], primes[N], cnt;

int main()
{
    for (int i = 2; i <= N; ++ i)
		if (!st[i])
		{
			primes[cnt ++ ] = i;
			for (int j = i + i; j <= N; j += i)
				st[j] = true;
		}
		
	cin >> l >> r;
	for (int i = 0; i < cnt; ++ i)
	{
		if (primes[i] < l) continue;
		if (primes[i] > r) break;
		// 说明有一组相等的
		if (primes[i + 1] - primes[i] == primes[i + 2] - primes[i + 1])
		{
			int L = i, R = i + 2;
			// 判断R是否可以往后扩大
			while (primes[R] - primes[R - 1] == primes[R + 1] - primes[R]) ++ R;
			for (int j = L; j <= R; ++ j) cout << primes[j] << ' ';
			cout << endl;
			i = R;
		}
	}
}