zoukankan      html  css  js  c++  java
  • CF1325D Ehab the Xorcist(二进制)

    传送门


    解题思路

    先将u和v二进制拆分,然后从低位向高位考虑。
    然后就是大力分类讨论:

    • 当某一位u是1且v是1时,要求这一位有奇数个1且前面有偶数个进位
    • 当某一位u是1且v是0时,要求这一位有奇数个1且前面有奇数个进位
    • 当某一位u是0且v是1时,要求这一位有偶数个1且前面有奇数个进位
    • 当某一位u是0且v是0时,要求这一位有偶数个1且前面有偶数个进位

    当某一位的进位数需要补充时,就令比它第一位的位置多两个1。
    最后答案即为1的数量最多的一位的数量。

    注意左移运算时一定要用1ll<<i。

    AC代码

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    template<class T>inline void read(T &x)
    {
        x=0;register char c=getchar();register bool f=0;
        while(!isdigit(c))f^=c=='-',c=getchar();
        while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
        if(f)x=-x;
    }
    template<class T>inline void print(T x)
    {
        if(x<0)putchar('-'),x=-x;
        if(x>9)print(x/10);
        putchar('0'+x%10);
    }
    long long u,v,num;
    int a[105],b[105],cnt[105],ans;
    int main(){
    	ios::sync_with_stdio(false);
    	cin>>u>>v;
    	for(int i=0;i<64;i++){
    		if(u&(1ll<<i)) a[i]=1;
    		if(v&(1ll<<i)) b[i]=1;
    	}
    	if(a[0]^b[0]||u>v){
    		cout<<-1<<endl;
    		return 0;
    	}
    	if(a[0]&b[0]) cnt[0]=1;
    	for(int i=1;i<64;i++){
    		if(a[i]^b[i]){
    			cnt[i]=a[i];
    			if(!(num&(1ll<<i))) cnt[i-1]|=2,num|=(1ll<<i);
    		}else{
    			cnt[i]=a[i]&b[i];			
    			if(num&(1ll<<i)) cnt[i-1]|=2,num+=(1ll<<i);
    		}
    		num+=(1ll*cnt[i])<<i;
    	}
    	for(int i=0;i<64;i++) ans=max(ans,cnt[i]);
    	cout<<ans<<endl;
    	while(ans--){
    		long long res=0;
    		for(int i=63;i>=0;i--){
    			res<<=1;
    			if(cnt[i]) res|=1,cnt[i]--;
    		}
    		cout<<res<<" ";
    	}
        return 0;
    }
    
  • 相关阅读:
    博客作业01-日期抽象数据类型的设计与实现
    C语言博客作业06--结构体&文件
    C语言博客作业05--指针
    C语言博客作业04--数组
    C语言博客作业03---函数
    C语言博客作业02----循环结构
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
    DS博客作业05--树
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15387937.html
Copyright © 2011-2022 走看看