题目链接
思路:sum%x意味把前面的放后面,x-sum%x以为着从后面取数放到前面
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+1;
typedef long long ll;
ll n,ans=1e18+7,num,t,a[maxn];
ll cal(ll x)
{
ll res=0,sum=0;
for(ll i=1;i<=n;++i)
sum=(sum+a[i])%x,res+=min(sum,x-sum);
return res;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
num+=a[i];
}
if(num==0) {
puts("0");return 0;
}
if(num==1){
puts("-1");return 0;
}
t=sqrt(num);
for(ll i=2;i<=t;++i)
{
if(num%i==0)
{
ans=min(ans,cal(i));
while(num%i==0) num/=i;
}
}
if(num>1) ans=min(ans,cal(num));
printf("%lld\n",ans);
}