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;
    }
    
  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15387937.html
Copyright © 2011-2022 走看看