题目数据有问题
查看原帖
题目数据有问题
1057338
tristiano楼主2024/10/14 20:55

感谢机房大佬提供的数据 第一个点数据: 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;
}```
2024/10/14 20:55
加载中...