cf
题目大意是给出一个数组a,每个元素只可操作一次(将a[i]变成a[i]*i),问最少操作几次可以使Πa[i]被2的n次方整除,首先这个数组连乘起来可以确定的是她们有多少个2的次方,我们把这个数求出来,与2的n次方比较大小,贪心的做法去找需要乘上多少个2的次方,从大到小去找,如果当前所得的2的次方数比2的n次方大,说明一定有一个小的可以实现
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N],cn[N];
void init()
{
int i,j;
b[1]=1;
for(i=2;i<=N;i=i*2)
{
b[i]=1;
}
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int i,j,k,m,n,t;
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
// init();
while(t--)
{
cin>>n;
int h=1>>n;
memset(cn,0,sizeof(cn));
int flag=0,s=0,p=0,num=0;
for(i=1;i<=n;i++)
{
int j=i;
while(j%2==0)
{
j=j/2;
cn[i]++;
}
cin>>a[i];
while(a[i]%2==0)
{
num++;
a[i]/=2;
}
}
sort(cn+1,cn+1+n,cmp);
int po=1,ans=0;
while(num<n)
{
if(po<n)
num+=cn[po],po++,ans++;
else
break;
}
if(num>=n)
cout<<ans<<endl;
else
cout<<"-1"<<endl;
// cout<<s<<endl;
}
}