Codeforces Round #586 1220D - Alex and Julian 解题报告

题目大意:

  有一个无穷整数的集合A,以及一个有限集合Bi,j属于A,如果abs(i-j)属于B,则ij相连,问在B中删除最少的数,使这样的无向图为二分图。

解题思路:

  1. 如果所有的数为奇数:
    因为奇数+奇数=偶数,奇数+偶数=奇数
    所以能够将所有符合条件的数,分成两边,一边为奇数,一边为偶数,那么这样的无向图,无疑是能构成二分图的
  2. 将这些奇数乘以 2 k 2^k 2k k > 0 k>0 k>0)无疑这些数也能够构成二分图,因为只要将原先的两边成上 2 k 2^k 2k即可
  3. 由1,2就知道如果一些数具有相同的幂数 ( 2 k ∗ c = a , c 为 奇 数 ) (2^k*c=a,c为奇数) (2kc=a,c),k即为a的幂数,这样的一些数就可以构成二分图
  4. 讨论当a,b具有不相同的幂数可没可能构成二分图:
    a = 2 k ∗ c a=2^k*c a=2kc, b = 2 t ∗ d b=2^t*d b=2td,k,t分别为a,b的幂数,假设 k < t k<t k<t,那么设 e = 2 t − k ∗ d e=2^{t-k}*d e=2tkd,所以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也不能同时构成二分图
  5. 由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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值