triples I(按位或运算及3的特性)(2019牛客暑期多校训练营(第四场)D)
示例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)的更多相关文章
- 牛客网多校赛第七场--C Bit Compression【位运算】【暴力】
链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客网多校赛第七场A--Minimum Cost Perfect Matching【位运算】【规律】
链接:https://www.nowcoder.com/acm/contest/145/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 2019牛客多校四 E. triples II (容斥)
大意: 给定$n,a$, 求$n$个$3$的倍数, $or$和为$a$的方案数. 简单容斥题 可以求出$f_{x,y}$表示所有$3$的倍数中, 奇数位不超过$x$个$1$, 偶数位不超过$y$个$1 ...
- 牛客编程巅峰赛S2第10场 - 钻石&王者 C.牛牛的路径和 (位运算,dfs)
题意:给你节点数为\(n\)的树,每个节点都有自己的权值,求所有路径的上的点的权值按位与的和. 题解:题目给的数据很大,我们不能直接去找.因此我们可以枚举二进制\([1,20]\)的每一位,然后再枚举 ...
- Codeforces Round #344 (Div. 2)(按位或运算)
Blake is a CEO of a large company called "Blake Technologies". He loves his company very m ...
- 出题人的女装(牛客练习赛38题B) (概率+分式运算)
链接:https://ac.nowcoder.com/acm/contest/358/B来源:牛客网 出题人的女装 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...
- 牛客练习赛 23 C 托米的位运算
链接:https://www.nowcoder.com/acm/contest/156/C来源:牛客网 托米完成了1317的上一个任务,十分高兴,可是考验还没有结束 说话间1317给了托米 n 个自然 ...
- 加法运算替代 牛客网 程序员面试金典 C++ Python
加法运算替代 牛客网 程序员面试金典 题目描述 请编写一个方法,实现整数的乘法.减法和除法运算(这里的除指整除).只允许使用加号. 给定两个正整数int a,int b,同时给定一个int type代 ...
- Swift学习笔记 - 位移枚举的按位或运算
在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 ...
随机推荐
- 2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础
2018-2019-2 网络对抗技术 20165322 Exp9 Web安全基础 目录 实验内容与步骤 (一)Webgoat安装 (二)SQL注入攻击 1.命令注入(Command Injection ...
- 【阿里云IoT+YF3300】9.快速开发modbus设备驱动
Modbus是一种串行通信协议,是莫迪康公司为PLC(编程逻辑控制器)通信而设计的协议.Modbus目前已经成为工业领域通信协议的业界标准,大部分的仪器仪表都支持该通信协议.很早以前就开发过基于Mod ...
- [转][linux][centos]嵌入式 Linux下编译并使用curl静态库
#x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...
- redis最大连接数
Well, it's a bit late for this post, but since I just spent a lot of time(the whole night) to config ...
- 我的一个PLSQL【我】 循环嵌套、游标使用、变量定义、查询插入表、批量提交事务、字符串截取、动态sql拼接执行
代码块: --CREATE OR REPLACE PROCEDURE PRO_REVENUE_STATISTICS --IS DECLARE --计数器 ins_counter PLS_INTEGER ...
- Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file at brut.androlib.res.decoder.ARSCDecoder.decode
使用ApkIDE反编译出现如下错误: Exception in thread "main" brut.androlib.AndrolibException: Could not d ...
- 将C++资源文件读取出来
HRSRC hResource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_CALC), TEXT(&q ...
- 算法习题---5.11邮件传输代理的交互(Uva814)
一:题目 当某人从user1@mta1发送给另一个人user1@mta2时,这两个MTA将会通信. 如果两个收件人属于同一个MTA,发送者的MTA只需与这个MTA通信一次就可以把邮件发送给这两个人. ...
- linux6 x86-64 RPM包安装mysql5.7.20
注意版本和此次更新时间 2017-12-03 版本:mysql-5.7.20-1.el6.x86_64 环境:linux6.x 官方下载地址: wget https://dev.mysql.co ...
- 标量子查询调优SQL
fxnjbmhkk4pp4 select /*+ leading (wb,sb,qw) */ 'blocker('||wb.holding_session||':'||sb.username||')- ...