题目大意;定义素数序列为长度大于等于2的切其中每个数之和为素数的一个数列,题目给出数列,让我们求出最短的素数序列,如果有长度相同的,则输出最先出现的。
思路:先素数打表,考虑到是区间问题,直接用一个数组s[i]记录前i个数的和;
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn=100000;
int p[maxn+10];
int num[1010];
int s[1010];
void intt()
{
memset(p,0,sizeof(p));
p[0]=1;
p[1]=1;
int m=sqrt(maxn+0.5);
for(int i=2;i<=m;i++)
{
if(!p[i])
{
for(int j=i*i;j<=maxn;j+=i)
p[j]=1;
}
}
}
int main()
{
int t,n;
bool flag;
scanf("%d",&t);
intt();
while(t--)
{
memset(s,0,sizeof(s));
flag=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
num[0]=0;
s[0]=0;
for(int i=1;i<=n;i++)
{
s[i]+=s[i-1]+num[i];
//printf("%d ",s[i]);
}
// printf("\n");
int start,lenn;
for(lenn=2;lenn<=n;lenn++)
{
for(start=1;start+lenn-1<=n;start++)
{
int m=s[start+lenn-1]-s[start-1];
//printf("%d\n",&m);
if(!p[m])
{
//printf("%d\n",m);
printf("Shortest primed subsequence is length %d:",lenn);
for(int i=start;i<=start+lenn-1;i++)
printf(" %d",num[i]);
printf("\n");
flag=1;
break;
}
}
if(flag)
break;
}
if(!flag)
printf("This sequence is anti-primed.\n");
}
return 0;
}