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的位移枚举的区分 ...
随机推荐
- mongo最大连接数查看
进入客户端 mongo 输入查看命令 db.serverStatus().connections
- macbook ios recovery and mount hfs+ journal and revert
sudo fsck.hfsplus -fryd /dev/sdc2 /sbin/fsck_hfs -yprd /dev/partitionName---can not fix b-tree node ...
- [Linux] scp指令用法
scp 指令用法 # scp usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [ ...
- java本地与树莓派中采用UDP传输文本、图片
今天解决了一个困扰好几天的问题,由于比赛需要,需要用java语言,并采用UDP传输协议,让树莓派与服务器(就是本机)建立连接传输视频,图片. 由于UDP是建立在无连接的协议上,因此就碰到了一个很尴尬的 ...
- 第10组 Alpha冲刺(3/6)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 对推送模块进行详细划分 基于用户的协同过滤,寻找更感兴趣的话题 学习API文档 ...
- PostgreSQL中定时job执行(pgAgent)
PostgreSQL中定时job执行 业务分析 近期项目需要定期清理数据库中的多余数据,即每月1号删除指定表中一年以上的数据. 初步分析这种定时job可以使用一下两种技术实现: Linux的cront ...
- Docker部署OpenProject
效果如下: 部署教程: 下载镜像: docker pull openproject/community: Install OpenProject with Docker Docker is a way ...
- R scholar和rentrez | NCBI和Google scholar文献数据挖掘
主要会用到两个R包: rentrez: 'Entrez' in Rscholar: Analyse Citation Data from Google Scholar RISmed 包可以查询 Pub ...
- 清理Windows.edb
解决Windows.edb文件巨大的windows 10问题的另一个快速解决方法是删除Windows.edb文件. 步骤1:在任务管理器中终止SearchIndexer.exe --按Ctrl + A ...
- Python 3.8.0 final¶ Release date: 2019-10-14
https://docs.python.org/3.8/whatsnew/changelog.html#python-3-8-0 Core and Builtins bpo-38469: Fixed ...