div 2 896 d1

#include 
using namespace std;
using VI = vector;
using PII = pair;
using ll = long long;
int n;

PII work(int x){
    int t = abs(x);
    for(int i = 0 ;  i < 31 ; i++){
        for(int j = 0 ; j < i ; j++){
            if((1 << i) - (1 << j) == t){
                return {i,j};
            }
        }
    }

    return {-1,-1};
}



void solve(){
    cin>>n;
    VI a ;
    VI ton(40,0);
    ll tot =  0;
    for(int i = 1 ; i <= n ; i++){
        int x;
        cin>>x;
        tot += x;
        a.push_back(x);
    }
    if(tot % n != 0) {
        cout<<"NO\n";
        return;
    }
    int avg = tot / n;
    for(int i = 0 ; i < n ; i++){
        if(a[i] == avg) continue;
        PII t = work(a[i] - avg);
        if(t.first == -1){
            cout<<"NO\n";
            return;
        }else{
            if(a[i] > avg){
                ton[t.first]++;
                ton[t.second]--;
            }else{
                ton[t.second]++;
                ton[t.first]--;
            }
        }
    }
    
    for(int i = 0 ; i < 31 ; i++){
        if(ton[i] != 0){
            cout<<"NO\n";
            return;
        }

    }
    cout<<"YES\n";

}



int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }

}



考虑每个数的 x + 2^a - 2^b =  avg

每个数的贡献 为 2^a 消耗为 2^b 

只要最后可以相互平掉,就YES

你可能感兴趣的:(基本算法,c++)