CF1325D
题目描述

题解
大力分类讨论,详见下方代码
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
int f=1,re=0;char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-'){f=-1,ch=getchar();}
for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
return re*f;
}
int n,m,bj,ans,vis[70];
signed main(){
n=read(),m=read();
if(!n&&!m){
printf("0\n");
return 0;
}
if(n>m){
printf("-1\n");
return 0;
}
if(n==m){
printf("1\n");
printf("%lld\n",n);
return 0;
}m=m-n;
if(m%2==1ll){
printf("-1\n");
return 0;
}
if(m%2==0ll){
for(int i=0;i<=62;i++){
if(n&(1ll<<i)) continue;
vis[i+1]=1;
}
for(int i=0;i<=62;i++){
if(m&(1ll<<i)&&!vis[i]){bj=1;break;}
if(m&(1ll<<i)&&vis[i]) vis[i]=2;
}
if(bj){
printf("3\n");
printf("%lld %lld %lld\n",m/2,m/2,n);
}
else{
printf("2\n");
for(int i=0;i<=62;i++)
if(vis[i]==2) ans+=(1ll<<(i-1ll)),n+=(1ll<<(i-1ll));
printf("%lld %lld",ans,n);
}
}return 0;
}
1175

被折叠的 条评论
为什么被折叠?



