刚上大一的小蓝,励志成为一名成功的 \text{acmer}acmer,斩获金牌。
最近,小蓝刚学习了经典问题中的最大子数组和问题。最大子数组和问题是 ACM 竞赛选手入门必学的一个问题,它要求在给定数组 aa 中选取一段连续子数组,使得该子数组的元素和达到最大值。
当然小蓝对自己的要求比较高,恰巧他刚学习了质数的知识,他想知道如果选取的子数组长度必须为质数的情况下,最大的子数组和能是多少呢?
请你帮忙解决这个问题。
这个题其实是关于一个前缀和的问题并且利用了质数的判断,首先要判断出前缀和,举一个例子比如1,2,3,4,5,6,那么从1开始接下去1,然后1,2,又是1,2,3......这样,结束后使用set=INT_MIN然后又进入另外一个循环必须i=2,因为要判断质数,接下去又是一个循环使用j=i,使用set=max(set,arr[j]-arr[j-i])这样子能找出所有情况.那么接下来代码
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
bool mm(long long sum){
for(int i=2;i*i<=sum;i++){
if(sum%i==0){
return false;
}
}
return true;
}
int main(){
long long n;
cin>>n;
vector<long long>arr(n+1);
for(int i=1;i<=n;i++){
cin>>arr[i];
arr[i]+=arr[i-1];
}
long long set=INT_MIN;
for(int i=2;i<=n;i++){
if(mm(i)){
for(int j=i;j<=n;j++){
set=max(set,arr[j]-arr[j-i]);
}
}
}
cout<<set;
return 0;
}