#include<bits/stdc++.h> usingnamespace std; #ifdef LOCAL #define debug(...) fprintf(stdout, ##__VA_ARGS__) #else #define debug(...) void(0) #endif #define int long long inlineintread(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back #define fi first #define se second //#define mo #define N 5010 #define M (N * 55) #define Mxdep 52 int n, m, i, j, k, T, rt; int cct;
structTrie_tree { int son[M][2], s[M]; int f[N][30], Len[N], tot; vector<int>dp[M]; voidclear(int &u){ if(!u) return ; clear(son[u][0]); clear(son[u][1]); s[u] = tot = 0; dp[u].resize(0); u = 0; } voidadd(int &u, int x, int dep){ if(!u) u = ++tot; if(dep == Mxdep) return s[u]++, void(); add(son[u][x & 1], x >> 1, dep + 1); } voidST(int R, int h){ int i, j, k; for(j = 1, Len[0] = -1; j <= s[R]; ++j) f[j][0] = dp[R][j] + j * (1ll << h), Len[j] = Len[j >> 1] + 1; for(k = 1; (1 << k - 1) <= s[R]; ++k) for(i = 1; i + (1 << k) - 1 <= s[R]; ++i) f[i][k] = min(f[i][k - 1], f[i + (1 << k - 1)][k - 1]); } intSq(int l, int r){ if(l > r) return1e18; int len = r - l + 1, k = Len[len]; // debug("[%lld %lld](%lld) min(%lld %lld)\n", l, r, k, f[l][k], f[r - (1 << k) + 1][k]); returnmin(f[l][k], f[r - (1 << k) + 1][k]); } voidrun(int u, int dep){ // debug("[%lld](%lld) : %lld || %lld\n", u, dep, s[u], ++cct); if(!u) return ; if(dep == Mxdep) { dp[u].resize(s[u] + 1); return ; } int L, R, k, i; run(L = son[u][0], dep + 1); run(R = son[u][1], dep + 1); if(s[L] > s[R]) swap(L, R); s[u] = s[L] + s[R]; if(!L) return dp[u] = dp[R], void(); dp[u].resize(s[u] + 1); ST(R, dep); // debug("point[%lld](%lld) = %lld + %lld\n", u, dep, L, R); for(k = 1; k <= s[u]; ++k) { dp[u][k] = 1e18; for(i = 1; i <= s[L]; ++i) { // debug("%lld + %lld [%lld %lld]\n", k, i, max(1ll, k - i), min(s[R], k)); int c1 = dp[L][i] + (1ll << dep) * (i - k); int c2 = Sq(max(1ll, k - i), min(s[R], k + i)); dp[u][k] = min(dp[u][k], c1 + c2); } // debug("dp[%lld][%lld] = %lld\n", u, k, dp[u][k]); } } }Trie;
signedmain() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif // srand(time(NULL)); T = read(); while(T--) { n = read(); Trie.clear(rt); rt = 0; for(i = 1; i <= n; ++i) { int x = read(); Trie.add(rt, x, 0); } Trie.run(rt, 0); printf("%lld\n", Trie.dp[rt][1]); }