
POJ 2739 Sum of Consecutive Prime Numbers
连续素数和:将一个整数分解为连续的素数之和,有多少种分法?
3.2常用技巧精选(一)
尺取法
简单,一次就AC了。先艾氏筛法做一份素数表,然后在素数表上爬行一遍就行了。最近好多事,通宵吧,第二天吃不消,不通宵吧,事情多得睡不着……
#include <iostream>
#include <vector>
using namespace std;
#define MAX_N 10000 + 16
// 先生成MAX_PRIME内的素数表
#define MAX_PRIME MAX_N
vector<int> primes;
vector<bool> is_prime;
void init_primes()
{
	is_prime = vector<bool>(MAX_PRIME + 1, true);
	is_prime[0] = is_prime[1] = false;
	for (int i = 2; i <= MAX_PRIME; ++i)
	{
		if (is_prime[i])
		{
			primes.push_back(i);
			for (int j = i * 2; j <= MAX_PRIME; j += i)
			{
				is_prime[j] = false;
			}
		}
	}
}
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
#endif
	init_primes();
	const int size = primes.size();
	int n;
	while (cin >> n && n)
	{
		int l = 0, r = 0, sum = 0, result = 0;
		for (;;)
		{
			while (sum < n && r < size)
			{
				sum += primes[r++];
			}
			if (sum < n)
			{
				break;
			}
			else if (sum == n)
			{
				++result;
			}
			sum -= primes[l++];
		}
		cout << result << endl;
	}
#ifndef ONLINE_JUDGE
	fclose(stdin);
	fclose(stdout);
	system("out.txt");
#endif
	return 0;
}
///////////////////////////End Sub//////////////////////////////////
又看到了神奇的0毫秒:
| 12877923 | hankcs | 2739 | Accepted | 260K | 0MS | C++ | 1226B | 2014-05-15 00:05:01 | 
 知识共享署名-非商业性使用-相同方式共享:码农场 » POJ 2739 Sum of Consecutive Prime Numbers 题解 《挑战程序设计竞赛》
码农场