示例1:

输入:

2

3

7

输出:

1 3
2 3 6

说明:3=3, (3|6)=7

题意:输出尽可能少的数字,他们的按位或结果为输入的数字a。

题解:(表示看不懂题解,看山东大佬的代码看懂的)首先:有两个奇怪的现象,就是一个数字的二进制(我的定义是第一位为0,即偶数)有且只有2个1,且分别在奇数位和偶数位上时,这个数一定是3的倍数。如果一个数字a(a>3)在奇数位和偶数位都有1,且1的数量都大于等于1,当a%3==1时,只有拿走一个偶数位上的1即可%3==0;当a%3==2时,只有拿走一个奇数位上的1即可%3==0。

1、如果输入的a是3的倍数,则直接输出a;

2、如果输入的a不是3的倍数,记录这个数的二进制在奇数位和偶数位上1的个数和位置,然后进行下面操作:

如果在奇数位和偶数位都存在1,则构造num1=0,num2=a,然后如果a%3==1,则将num2偶数位上的一个1拿走,给num1奇数位和偶数位各一个已存在的1;如果a%3==2,则将num2奇数位上的一个1拿走,给num1奇数位和偶数位各一个已存在的1;

如果只在奇数位或偶数位上存在1,同样构造num1=0,num2=a,逐步拿走num2上的1和给num1已存在的1,直至num2%3==0,num2停止拿走1,num1继续得到已存在的1,直到num1%3=0结束,完成构造。

AC代码:

 #include<bits/stdc++.h>
#define LL long long
#define pb push_back
using namespace std;
LL num1,num2;
void solve(LL x)
{
num1=,num2=x;
vector<int>odd,even;
for(int i=;i<=;i++){//将奇数位和偶数位上的1的位置取出并保存
if((x>>i)&){
if(i%)odd.pb(i);
else even.pb(i);
}
}
if(odd.size()&&even.size()){//奇数位和偶数位上都存在1的情况
if(x%==){
num2^=(1LL<<even[]);
num1^=(1LL<<even[]);
num1^=(1LL<<odd[]);
}
else{
num2^=(1LL<<odd[]);
num1^=(1LL<<even[]);
num1^=(1LL<<odd[]);
}
}
else if(odd.size()){//只有奇数位上存在1的情况
int i;
for(i=;i<odd.size();i++){
num1^=(1LL<<odd[i]),num2^=(1LL<<odd[i]);
if(num2%==){
i++;break;
}
}
for(;i<odd.size();i++){
if(num1%==)break;
num1^=(1LL<<odd[i]);
}
}
else{//只有偶数位上存在1的情况
int i;
for(i=;i<even.size();i++){
num1^=(1LL<<even[i]),num2^=(1LL<<even[i]);
if(num2%==){
i++;break;
}
}
for(;i<even.size();i++){
if(num1%==)break;
num1^=(1LL<<even[i]);
}
}
}
int main()
{
LL t,n;
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
vector<LL>num;
if(n%==){
num.pb(n);
}
else {
solve(n);//a%3!=0的情况下进行构造。
num.pb(num1);num.pb(num2);
}
if(num.size()==)
printf("1 %lld\n",num[]);
else if(num.size()==)
printf("2 %lld %lld\n",num[],num[]);
}
return ;
}

triples I(按位或运算及3的特性)(2019牛客暑期多校训练营(第四场)D)的更多相关文章

  1. 牛客网多校赛第七场--C Bit Compression【位运算】【暴力】

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...

  2. 牛客网多校赛第七场A--Minimum Cost Perfect Matching【位运算】【规律】

    链接:https://www.nowcoder.com/acm/contest/145/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  3. 2019牛客多校四 E. triples II (容斥)

    大意: 给定$n,a$, 求$n$个$3$的倍数, $or$和为$a$的方案数. 简单容斥题 可以求出$f_{x,y}$表示所有$3$的倍数中, 奇数位不超过$x$个$1$, 偶数位不超过$y$个$1 ...

  4. 牛客编程巅峰赛S2第10场 - 钻石&王者 C.牛牛的路径和 (位运算,dfs)

    题意:给你节点数为\(n\)的树,每个节点都有自己的权值,求所有路径的上的点的权值按位与的和. 题解:题目给的数据很大,我们不能直接去找.因此我们可以枚举二进制\([1,20]\)的每一位,然后再枚举 ...

  5. Codeforces Round #344 (Div. 2)(按位或运算)

    Blake is a CEO of a large company called "Blake Technologies". He loves his company very m ...

  6. 出题人的女装(牛客练习赛38题B) (概率+分式运算)

    链接:https://ac.nowcoder.com/acm/contest/358/B来源:牛客网 出题人的女装 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  7. 牛客练习赛 23 C 托米的位运算

    链接:https://www.nowcoder.com/acm/contest/156/C来源:牛客网 托米完成了1317的上一个任务,十分高兴,可是考验还没有结束 说话间1317给了托米 n 个自然 ...

  8. 加法运算替代 牛客网 程序员面试金典 C++ Python

    加法运算替代 牛客网 程序员面试金典 题目描述 请编写一个方法,实现整数的乘法.减法和除法运算(这里的除指整除).只允许使用加号. 给定两个正整数int a,int b,同时给定一个int type代 ...

  9. Swift学习笔记 - 位移枚举的按位或运算

    在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 ...

随机推荐

  1. mui openWindow方法详细说明

    mui.openWindow({ url: 'xxx.html', //String类型,要打开的界面的地址 id: 'id', //String类型,要打开的界面的id styles: { //We ...

  2. Looper: Looper,Handler,MessageQueue三者之间的联系

    在Android中每个应用的UI线程是被保护的,不能在UI线程中进行耗时的操作,其他的子线程也不能直接进行UI操作.为了达到这个目的Android设计了handler Looper这个系统框架,And ...

  3. Android命名规范(重点讲解:包名)

    Android程序开发中,使用规范的命名有益于程序的开发和后期阅读.本文主要对Android程序包名的定义做详细介绍,并附带一些简单的命名规则. 一.标识符命名方法1 .小驼峰命名法,除首单词外,其余 ...

  4. nxp基于layerscape系列芯片的硬件型号解析

    每一种layerscape系列芯片都有两种硬件型号: RDB 和QDS RDB: Refrence Design Board QDS: QorIQ Development system

  5. 获取并打印Spring容器中所有的Bean名称

    思路: 1.实现Spring的ApplicationContextAware接口,重写setApplicationContext方法,将得到的ApplicationContext对象保存到一个静态变量 ...

  6. Eclipse | 如何修改web项目的访问链接名,项目名

    转: Eclipse | 如何修改web项目的访问链接名,项目名 2018-01-04 17:52:05 Mandsence 阅读数 2180更多 分类专栏: 其他   版权声明:本文为博主原创文章, ...

  7. 解决 Win10 系统新建文件夹后需手动刷新才能显示

    摘自:https://blog.csdn.net/weixin_44447687/article/details/100702968 1.点击开始菜单,选择“运行”功能,然后在运行打开框中输入 reg ...

  8. 安卓 android studio 报错 Could not find com.android.tools.build:gradle:3.2.1.

    报错截图如下: 解决方法:在project的builde.gradle做如下操作分别加上google()

  9. 论H5嵌入APP的联合登录的解决方案

    什么是联合登录 因为公司产品的发展,会与第三方的一些商户进行对接,商户APP提供入口,进入我们的H5页,从而提供服务. 而商户希望用户在其APP进行账户登录后,进入H5页不再进行登录,所以我们的H5需 ...

  10. k8s版jenkins--master/slave模式实现CI/CD---带solo开源博客项目--带maven、djk、git工具

    k8s环境: 192.168.0.91 master 192.168.0.92 node 192.168.0.96 gitlab 192.168.0.98 harbor k8s集群安装请参照:http ...