題意
盒排成一列的糖果盒,第盒有個糖果
每次可以取出某一盒一顆糖果放到相鄰的糖果盒裏
問使得所有盒子的裏的糖果數均能被某個整除的最少移動次數
題解
設糖果總數的(顯然無解)
符合條件的一定滿足
考慮對於一個如何求解最少的移動次數
首先肯定要將所有的對取餘
對於一個可以將顆糖果全部向後挪,於是
也可以從後面挪顆糖果到上,於是
設,那麼
通過上面可以發現如果如果,且
那麼的答案一定不會比優,所以只需要枚舉的質因子即可
題目當中,而,所以計算次數不會太多
時間複雜度爲質因子個數
using ll=long long;
inline ll Calc(ll p){
ll Cnt=0,Tmp=0;
for(int i=1;i<=n;++i)
Cnt=(Cnt+a[i])%p,Tmp+=min(Cnt,p-Cnt);
return Tmp;
}
inline void Sol(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",a+i),Sum+=a[i];
if(Sum<2)
return(void)puts("-1");
Ans=-1ull>>1;
for(int i=2;(ll)i*i<=Sum;++i)
if(Sum%i==0){
while(Sum%i==0)Sum/=i;
Ans=min(Ans,Calc(i));
}
if(Sum>1)
Ans=min(Ans,Calc(Sum));
printf("%d\n",Ans);
}