满足二分图的性质。在纸上画一下,明显可以看出
固定一个数X时
B集合中的
数要符合:X,3*X,5*X,7*X…………
且不能等于X*2,X*4,X*8…………
暴力做法就是枚举所有X可能取值。
但我们这样想:
当X取1时,为全体奇数,是一组解。(X取其他奇数肯定没X取1的集合大,且不能有其他数)
然后就是X取偶数的情况。
我们不妨把X除于2,这q个偶数就变成了奇数与偶数混合的数组。
这个集合中所有奇数肯定也是一组解,(不包含除2 之前的奇数)
以此类推
我们记录除以 ct次 2 的奇数集合的个数,取最大即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//typedef __int128 LL;
//typedef unsigned long long ull;
#define F first
#define S second
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ld,ld> pdd;
const ld PI=acos(-1);
const ld eps=1e-9;
//unordered_map<int,int>mp;
/*int head[M],cnt;
struct EDGE{int to,nxt,val;}ee[M];
void add(int x,int y,int z){ee[++cnt].nxt=head[x],ee[cnt].to=y,ee[cnt].val=z,head[x]=cnt;}*/
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const int seed=131;
const int M = 2e5+7;
ll b[M];
int nm[M];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>b[i];
int ct=0;
for(int i=1;i<=n;i++)
{
ct=0;
ll tp=b[i];
while(tp)
{
++ct;
if(tp&1){
nm[ct]++;
break;
}
tp/=2;
}
}
int ma=-1,id=-1;
for(int i=1;i<=100;i++){
if(ma<nm[i])ma=nm[i],id=i;
// cout<<nm[i]<<" "<<i<<endl;
}
cout<<n-nm[id]<<endl;
ll z=1;
id--;
// cout<<id<<endl;
while(id)z*=2,id--;
// cout<<z<<" -- "<<id<<" "<<ma<<endl;
for(int i=1;i<=n;i++)
{
// cout<<b[i]%z<<" "<<b[i]/z<<endl;
if(b[i]%z==0&&((b[i]/z)%2==1))
continue;
cout<<b[i]<<" ";
}
return 0;
}