ソリューション:
各1を保存します。次いで総数CNTを記録する。1、各セットがKの倍数であるように、Kがある場合、操作の数を最小限にするために、このCNT kが素因数であるべきです。(必要数が2の一定数よりも小さくなるように回数の変更の各セットは、4を必要とすることセットの数、各セットのそれぞれ)
CNT素因数1-Xコンフィギュレーション即ち新しいコレクション、Xを列挙しました。コンフィギュレーションの新しい設定した場合ときハッシュ(中央値)の中央には2つの側面。残りは暴力です。。。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 CONST LL INF = 1E18 + 7 。 CONST N = 1E5 + LL 7 。 [N]をARRちゃいます。 ベクトル <LL> VEの。 LL CAL(LL X){ LL和 = 0 。 LL X1 = X / 2 。 以下のために(iは= LL 0 ; I <ve.size()I + = {x)の ための(LL用J = I; J <iは+ X1、J ++ ){ 合計 + = Veを[iが+ X1] - [j]をVEの; } のための(LL J = + X-1 ; J> I + X1; j-- ){ 合計 + = VEの[J] -ve [I + X1]。 } } 戻り値の和。 } ボイド解く(){ LL N。 cinを >> N; LL CNT = 0 。 以下のための(iは= LL 1、I <= N; I ++ ){ CIN >> ARR [I]。 もし(ARR [I]){ CNT ++ 。 ve.push_back(I); } } もし(CNT == 1 || N == 1 ){ COUT<< - 1 << ENDL。 リターン; } LL M = SQRT(CNT)。 合計北韓 = INF。 以下のための(iは= LL 2 ; I <= M; I ++ ){ 場合(CNT%I == 0 ){ 合計 = 分(合計、CAL(I))。 一方(CNT%I == 0 ){ CNT / = I。 } } } もし(!CNT = 1 ){ 合計 = 分(合計、CAL(CNT))。 } coutの <<合計<< てendl; リターン; } int型のmain(){ )(解きます。 リターン 0 ; }