[Codeforces1254B]Send Boxes to Alice

题意

n n 盒排成一列的糖果盒,第 i i 盒有 a i a_i 个糖果

每次可以取出某一盒一颗糖果放到相邻的糖果盒里

问使得所有盒子的里的糖果数均能被某个 k ( k > 1 ) k(k>1) 整除的最少移动次数


题解

设糖果总数的 S u m Sum (显然 S u m = 1 Sum=1 无解)

符合条件的 k k 一定满足 k S u m k\mid Sum

考虑对于一个 k k 如何求解最少的移动次数

首先肯定要将所有的 a i a_i k k 取余

对于一个 a i a_i 可以将 a i a_i 颗糖果全部向后挪,于是 a i + 1 = ( a i + 1 + a i ) m o d    k a_{i+1}=(a_{i+1}+a_i)\mod k

也可以从后面挪 k a i k-a_i 颗糖果到 a i a_i 上,于是 a i + 1 = a i + 1 ( k a i ) a i + 1 + a i m o d    k a_{i+1}=a_{i+1}-(k-a_i)\equiv a_{i+1}+a_i \mod k

S i = k = 1 i a i m o d    k S_i=\sum_{k=1}^ia_i \mod k ,那么 A n s = i = 1 n min ( S i , k S i ) Ans=\sum_{i=1}^n\min(S_i,k-S_i)

通过上面可以发现如果如果 k 1 S u m , k 2 S u m k_1\mid Sum,k_2\mid Sum ,且 k = k 1 k 2 S u m k=k_1k_2\mid Sum

那么 k k 的答案一定不会比 k 1 , k 2 k_1,k_2 优,所以只需要枚举 S u m Sum 的质因子即可

题目当中 S u m 1 0 12 Sum\le10^{12} ,而 2 × 3 × 5 × × 37 > 1 0 12 2\times3\times5\times\ldots\times37>10^{12} ,所以计算次数不会太多

时间复杂度为 O ( n × S u m O(n\times Sum 质因子个数 + S u m ) +\sqrt{Sum})

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);
}

猜你喜欢

转载自blog.csdn.net/BeNoble_/article/details/103181464