思路:记录1的数量为cnt,显然最好的答案肯定在cnt的质因子中,枚举质因子暴力就行了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
ll n,ans=1e18+7,num,t;
vector<int>cnt;
ll cal(ll x)
{
ll s=x/2,res=0;
for(ll i=0;i<cnt.size();i+=x)
{
for(ll j=i;j<i+s;++j) res+=cnt[i+s]-cnt[j];
for(ll j=i+x-1;j>i+s;--j) res+=cnt[j]-cnt[i+s];
}
return res;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&t);
if(t) num++,cnt.push_back(i);
}
if(n==1||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);
}