D. Divisibility by 2^n
原题链接:Problem - 1744D - Codeforces
题目大意:
题目做法:
AC代码:
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define fast ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using namespace std;
int p2[signed(3e5+10)];
int cal(int num){
int res = 0;
while(num){
if(num % 2 == 0){
res += 1;
num /= 2;
}
else break;
}
return res;
}
void init(){
for(int i = 1; i < 3e5+10 ;i++){
p2[i] = cal(i);
}
}
void solve(){
int n, inires = 0, op = 0;
cin >> n;
priority_queue<int> q;
int ar[n+10];
for(int i = 0; i < n; i++){
cin >> ar[i];
inires += cal(ar[i]);
q.push(p2[i + 1]);
}
if(inires >= n){
cout << op << '\n';
return ;
}
// cout << inires << '\n';
while(!q.empty()){
inires += q.top();
q.pop();
op += 1;
if(inires >= n){
cout << op << '\n';
return ;
}
// cout << q.top() << '\n';
}
cout << "-1" << '\n';
}
signed main(){
init();
fast int casen = 1;
cin >> casen;
while(casen--) solve();
}
事后ps: