法1打表:可以间接的由prime来更新ans(枚举连续和的长度和起点即可)
法 2sum of CONSECUTIVE 尺取
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=1e4;
vector<ll> p;
ll pre[N+20];
int res[N+20];//res[i] i能写成连续素数和的方法数
bool check(int k)
{
for(int i=2;i<=sqrt(k);i++)
{
if(k%i==0)
return false;
}
return true;
}
void solve()
{
memset(res,0,sizeof(res));
memset(pre,0,sizeof(pre));
pre[0]=0;
for(int i=1;i<=p.size();i++)//前缀和 方便算(l,r)的和
{
pre[i]=pre[i-1]+p[i-1];
}
//可以间接的由prime来更新ans(枚举连续和的长度和起点即可)
for(int d=1;d<=p.size();d++)//连续和的长度
{
for(int i=0;i+d<p.size();i++)//枚举起点
{
ll sum=pre[i+d]-pre[i];
if(sum<=1e4)
{
// cout<<sum<<endl;
res[sum]++;
}
}
}
}
int main()
{
for(int i=2;i<=N;i++)
{
if(check(i))
{
p.push_back(i);
}
}
solve();
int n;
while(cin>>n&&n)
{
cout<<res[n]<<endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <string>
#include <set>
#include <map>
#include <list>
#include <vector>
#include <queue>
#include <stack>
#include <sstream>
#include <iomanip>
typedef long long ll;
typedef unsigned long long llu;
using namespace std;
vector<int> prime;
void init()
{
int num[150000]= {0};
for(int i=2; i*i<10000+10; i++)
for(int j=i*i; j<10000+10; j+=i)
num[j]=1;
for(int i=2; i<10000+10; i++)
if(!num[i])
prime.push_back(i);
}
int main()
{
init();
int x;
while(cin>>x && x)
{
int l=0, r=0, sum=prime[0];
int ans=0;
while(l<=r && prime[r]<=x && r<prime.size())
{
if(sum==x)
{
ans++;
sum-=prime[l++];
}
else if(sum>x)
sum-=prime[l++];
else
sum+=prime[++r];
}
cout<<ans<<endl;
}
return 0;
}