/*
translation:
给出一个数,求有多少种用连续的素数之和来表示该数的方法。
solution:
尺取法。
预处理筛出数据范围内的所有素数,然后将其存进数组里面,在这个数组的基础上使用尺取即可。
note:
date:
2016.11.13
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 10000 + 5;
int prime[maxn], p;
bool is_prime[maxn];
int n;
void init()
{
int p = 0;
for(int i = 0; i < maxn; i++) is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for(int i = 2; i < maxn; i++){
if(is_prime[i]){
prime[p++] = i;
for(int j = i*2; j < maxn; j += i) is_prime[j] = false;
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
init();
while(~scanf("%d", &n) && n){
int sum = 0, l = 0, r = 0;
int len = 0;
while(prime[len] <= n) len++;
int ans = 0;
while(l <= len && r <= len){
if(sum < n) sum += prime[r++];
else if(sum > n) sum -= prime[l++];
else{
ans++;
sum += prime[r++];
}
if(r == l) r++;
}
printf("%d\n", ans);
}
return 0;
}
poj2739(尺取模型)
最新推荐文章于 2019-03-08 18:47:29 发布