Codeforces Round #601 (Div. 2) E2 Send Boxes to Alice (Hard Version)

#include <iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=1000010;
int a[maxn];
long long sum[maxn];
int n;
inline ll solve(long long k) {
    ll res=0;
    for(int i=1; i<=n; i++) {
        //对于当前值ai,要么就是ai%x放到后面,要么就是从后面拿x-ai%x,放到ai
        //当为sum[1],也就是只有a[1],相当于就把a[1]变成k的整数倍
        //当为sum[2],也就是a[1]+a[2],因为在前面已经把a[1]处理好,所以这里相当于只处理a[2]
        //一次类推
        ll x=sum[i]%k;
        res+=min(x,k-x);
    }
    return res;
}
int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        scanf("%d",a+i);
        sum[i]=a[i]+sum[i-1];
    }
    long long tot=sum[n],ans=0x7f7f7f7f7f7f7f7f;
    for(ll i=2; i*i<=tot; i++) {
        if(tot%i) continue;//因子
        ans=min(ans,solve(i));
        while (tot%i==0) {//除去所有质因子
            tot/=i;
        }
    }
    if(tot!=1) ans=min(ans,solve(tot));//最后可能剩下一个因子,没有涉及到
    if(ans!=0x7f7f7f7f7f7f7f7f) cout<<ans<<endl;
    else cout<<-1<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11951228.html