题目大意:
有一个无穷整数的集合A,以及一个有限集合B,i,j属于A,如果abs(i-j)属于B,则i,j相连,问在B中删除最少的数,使这样的无向图为二分图。
解题思路:
- 如果所有的数为奇数:
因为奇数+奇数=偶数,奇数+偶数=奇数
所以能够将所有符合条件的数,分成两边,一边为奇数,一边为偶数,那么这样的无向图,无疑是能构成二分图的 - 将这些奇数乘以 2 k 2^k 2k( k > 0 k>0 k>0)无疑这些数也能够构成二分图,因为只要将原先的两边成上 2 k 2^k 2k即可
- 由1,2就知道如果一些数具有相同的幂数 ( 2 k ∗ c = a , c 为 奇 数 ) (2^k*c=a,c为奇数) (2k∗c=a,c为奇数),k即为a的幂数,这样的一些数就可以构成二分图
- 讨论当a,b具有不相同的幂数可没可能构成二分图:
a = 2 k ∗ c a=2^k*c a=2k∗c, b = 2 t ∗ d b=2^t*d b=2t∗d,k,t分别为a,b的幂数,假设 k < t k<t k<t,那么设 e = 2 t − k ∗ d e=2^{t-k}*d e=2t−k∗d,所以c和e就为不同奇偶的两个数,设 p = l c m ( c , e ) p=lcm(c,e) p=lcm(c,e),所以0到p分别有两条路径:0,c,2c,…,p以及0,e,2e,3e,…,p,长度也分别为 p c \frac{p}{c} cp以及 p e \frac{p}{e} ep所以构成环的长度:len= p c \frac{p}{c} cp+ p e \frac{p}{e} ep= c g c d ( c , e ) \frac{c}{gcd(c,e)} gcd(c,e)c+ e g c d ( c , e ) \frac{e}{gcd(c,e)} gcd(c,e)e,所以len为奇数,因为二分图中不存在奇数环,所以c,e不可能同时构成二分图,所以a,b也不能同时构成二分图 - 由1,2,3,4本题只要找到B中最多数量相同的幂数,把其他的删除即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll b[200100],z[200100],cnt[200100],ans=0,Max=0;
int main() {
scanf("%lld",&n);
for(int i=1; i<=n; i++) {
scanf("%lld",&b[i]);
z[i]=__builtin_ctzll(b[i]);//__builtin_ctzll函数计算(后缀0的个数)
cnt[z[i]]++;//当前幂数加一
if(cnt[z[i]]>Max) {
ans=z[i];
Max=cnt[z[i]];
}
}
printf("%lld\n",n-Max);
for(int i=1; i<=n; i++)
if(z[i]!=ans)
printf("%lld ",b[i]);
return 0;
}