感谢机房大佬提供的数据
第一个点数据:
10 75 20 14 21 30 18 42 27 36 16
手模/爆搜得到结果均为32
但正解答案为29
本人所用的只使用了幂次序列优化的爆搜见下(若您对本人程序由疑问,可以通过去掉solve中注释得到幂次序列的打印):
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+5;
const long long INF =1e13+5;
long long ans;
int n;
int a[MAXN];
int b[MAXN];//幂次数列
int blen;
long long tempans;
void csh2(){
for(int i=1;i<=blen+1;i++){
b[i]=0;
}
blen=0;
}
void seek(long long val){
bool flag=1;
for(int i=1;i<blen;i++){
if(b[i]>0&&b[i+1]>0){
flag=0;
b[i]-=1;b[i+1]-=1;
seek(val+1);
b[i]+=1;b[i+1]+=1;
}
}
if(flag){
tempans=min(tempans,val);
}
}
void solve(int st,int p){
blen=1;
while(a[st+blen]%p==0&&st+blen<=n){
while(a[st+blen]%p==0){
a[st+blen]/=p;b[blen+1]++;
}
blen++;
}
if(blen==1)return ;
/*cout<<p<<endl;
for(int i=1;i<=blen;i++){
cout<<b[i]<<' ';
}cout<<endl;*/
if(blen>=2){
tempans=INF;
seek(0);
}
//cout<<p<<'*'<<tempans<<endl;
ans+=tempans*p;
}
int main(){
//freopen("data.in","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){//左端点
if(a[i]>1){
for(int j=2;j*j<=a[i];j++){
if(a[i]%j==0){
while(a[i]%j==0){a[i]/=j;b[1]++;}
solve(i,j);csh2();
}
}
if(a[i]>1)
{
b[1]=1;
solve(i,a[i]);a[i]/=a[i];csh2();
}
}
}
cout<<ans<<endl;
return 0;
}```