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的位移枚举的区分 ...
随机推荐
- mysql查看数据库表数量
1.查看数据库表数量SELECT count(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='dbname'; selec ...
- 【转】利用Python将多个PDF合并为一个
本脚本用来合并pdf文件,输出的pdf文件按输入的pdf文件名生成书签 使用示例如下: python pdfmerge.py -p "D:\pdf-files" -o " ...
- Geometry and Appearances【转】
https://github.com/AnalyticalGraphicsInc/cesium/wiki/Geometry-and-Appearances Geometry and Appearanc ...
- 编程基础-c语言中指针、sizeof用法总结
1.指针 学习 C 语言的指针既简单又有趣.通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的.所以,想要成为一名优秀的 C 程序员,学习指针是很有必要的. ...
- Java性能分析神器-JProfiler详解(转)
前段时间在给公司项目做性能分析,从简单的分析Log(GC log, postgrep log, hibernate statitistic),到通过AOP搜集软件运行数据,再到PET测试,感觉时间花了 ...
- jenkins关联shell命令修改pom项目版本
#获取pom文件内的项目版本 version=`awk '/<version>[^<]+<\/version>/{gsub(/<version>|<\/ ...
- Visual Studio 2019更新到16.1.4
Visual Studio 2019更新到16.1.4 此次更新仍然是修复bug为主,涉及到Xcode 11无法启动模拟器.Xamarin.Android SDK 9.3.0.23的调试bug.
- Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型 1.返回顶部 1. 整型数值类型(C# 参考) 2019/10/22 “整型数值类型”是“简单类型”的 ...
- [原][资料整理][osg]osgDB文件读取插件,工作机制,支持格式,自定义插件
参考: osgPlugins相关 osg读取文件的原理(插件工作机制) 当使用osgDB读取文件时,会自动根据文件的扩展名来到插件目录中寻找相应的插件,来实现. 比如: osgviewer cow.o ...
- java输出一个目录下的子目录
java输出一个目录下的子目录 package com.vfsd.core; import java.io.File; public class ListDir { public static voi ...