知识点:质数,尺取法
这个题显然可以使用尺取法,因为满足单调性和连续区间这两个条件,先用质数筛求出可能用到的质数,这样这个问题就变成了求多少个子数组和等于题目输入的数,用尺取法,这里稍微思考了一下就是尺取法的退出的条件,这个写的和上一次的不一样,当所有的数都查找完或者当前的子数组的长度是1的话,那么就退出,这是这次想的判断退出的条件
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int n, h[N], a[N], m;
void solve() {
for (int i = 2; i < N; i++) {
if (!h[i]) {
a[++m] = i;
for (int j = i + i; j < N; j += i) h[j] = 1;
}
}
}
int main() {
solve();
while (scanf("%d", &n) && n) {
int ans = 0, l = 1, r = 1, sum = 0;
while (true) {
while (r <= m && sum < n) {
sum += a[r++];
}
if (sum == n) ans++;
if (r == m + 1 || r - l == 1) break;
sum -= a[l++];
}
printf("%d\n", ans);
}
return 0;
}