链接
Codeforces 1220 D.Alex and Julian
题解
首先如果 B B B中全是奇数,那么自动根据奇偶分成二分图,此时如果给 B B B中所有数同时乘上一个相同的 2 2 2的 x x x次幂,那么根据所有数从低到高第 x x x位的 1 / 0 1/0 1/0同样可以确定为二分图。同时如果 B B B中有两个数中 2 2 2的次幂不同,这两个数就会导致奇环而使得整个图不是二分图。原因很简单,环的长度 l e n = l c m ( a , b ) a + l c m ( a , b ) b len = \frac{lcm(a, b)}{a} + \frac{lcm(a, b)}{b} len=alcm(a,b)+blcm(a,b) = b g c d ( a , b ) + a g c d ( a , b ) = \frac{b}{gcd(a,b)} +\frac{a}{gcd(a, b)} =gcd(a,b)b+gcd(a,b)a
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
inline LL read()
{
LL x = 0;
bool t = false;
char ch = getchar();
while ((ch < '0' || ch > '9') && ch != '-')
ch = getchar();
if (ch == '-')
t = true, ch = getchar();
while (ch <= '9' && ch >= '0')
x = x * 10 + ch - 48, ch = getchar();
return t ? -x : x;
}
int n;
vector<LL> vec[110];
int main()
{
n = read();
LL x;
for (int i = 1; i <= n; ++i)
{
x = read();
int cnt = 0;
while (x % 2 == 0)
{
++cnt;
x /= 2;
}
vec[cnt].push_back(x);
}
int Max = vec[0].size(), id = 0;
for (int i = 1; i < 100; ++i)
if (vec[i].size() > Max)
{
Max = vec[i].size();
id = i;
}
printf("%lld\n", n - Max);
for (int i = 0; i < 100; ++i)
{
if (!vec[i].size() || i == id)
continue;
for (auto x : vec[i])
printf("%lld ", (x << i));
}
return 0;
}