Think:
1题意:输入正整数n(2 <= n <= 10000),求连续素数之和等于n的方案数
2思路:
1>筛法建立素数表+初级dp思想(从后往前规划得到当前素数可连续组合得到的数值)
2>参考博客:“素数表+区间滑动”,“素数表+区间枚举”
以下为Accepted代码
#include <bits/stdc++.h>
using namespace std;
int tp, link[10400], dp[10400];
void Init_prime();
void Init_dp();
int main(){
Init_prime();
Init_dp();
int n;
while(scanf("%d", &n) && n){
printf("%d\n", dp[n]);
}
return 0;
}
void Init_prime(){
int v[10400];
tp = 0;
memset(v, 0, sizeof(v));
v[1] = 1, v[2] = 0;
for(int i = 2; i <= 10000; i++){
if(!v[i]){
link[tp++] = i;
for(int j = i*2; j <= 10000; j += i){
v[j] = 1;
}
}
}
}
void Init_dp(){
memset(dp, 0, sizeof(dp));
for(int i = tp-1; i >= 0; i--){
int t = 0;
for(int j = i; j >= 0; j--){
if(t + link[j] <= 10000){
t += link[j];
dp[t] += 1;
}
else
break;
}
}
}