1. 程式人生 > >B - Help Hanzo (LightOJ - 1197)

B - Help Hanzo (LightOJ - 1197)

全部 ret 一個 區間 ons ems 思路 由於 cas

- 題目大意

在一個區間中去尋找素數的個數。

- 解題思路

由於a,b的取值範圍比較大,無法把這個區間內的所以素數全部篩選出來,但是b-a這個區間比較小,所以可以用區間素數篩選的辦法解決這個題目。

- 代碼

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int MAX = 1e6 + 5;
bool vis[MAX],vis2[MAX];
int cnt = 0;
int p[MAX];
void num()
{
	
	memset(vis, 0, sizeof(vis));
	vis[1] = 1;
	for (int i = 2; i <MAX; i++)
	{
		if (!vis[i])
		{
			p[cnt++] = i;
			for (long long j = i*2; j <= MAX; j += i)
			{
				vis[j] = 1;
			}
		}
	}
}
int main()
{
	long long n, a, b;
	cin >> n;
	num();
	for (long long  i = 1; i <= n; i++)
	{
		long long sum = 0;
		cin >> a >> b;
		if (b <= MAX - 1)
		{
			for (long long i = a; i <= b; i++)
			{
				if (!vis[i])
					sum++;
			}
		}
		else
		{
			memset(vis2, 0, sizeof(vis2));
			for (int i = 0; i<cnt&&p[i] <= b; i++)
			{
				long long k = a / p[i];
				if (k*p[i]<a)
					k++;
				for (long long j = k * p[i]; j <= b; j += p[i])
				{
					vis2[j - a] = 1;
				}
			}
			for (long long i = a; i <= b; i++)
			{
				if (!vis2[i - a])
					sum++;
			}
		}
		cout << "Case " << i << ": ";
		cout << sum << endl;
	}
	return 0;
}

  

B - Help Hanzo (LightOJ - 1197)