NOIP模拟赛2(two)
题目描述 Description###
很久很久很久以前,方方方造了一台计算机,计算机中开始有一个数 \(0\) 。方方方想要让这个数变成 \(a\) ,他打算每次选择一个整数,把计算机中当前的数按位或上这个数。
这时候黑恶势力 \(zzq\) 出现了:为了符合题目名称,方方方选择的整数必须是三的倍数。zzq 想知道在这个条件下能不能得到 \(a\) ,如果能得到,给出一种步数尽量小的方案。
输入描述 Input Description###
第一行一个整数 \(T\) ,表示数据组数。
接下来 \(T\) 行每行一个正整数 \(a\) ,表示想要得到的整数。
输出描述 Output Description###
对于每组数据,如果该组数据无解,输出一行\(-1\) 。
如果该组数据有解,你需要在一行中输出方案,行的开头输出你需要进行几
次或操作,接下来用空格分割输出你要或上的每个数。
不懂的话可以参见样例输出。
样例输入 Sample Input###
3
3
2
7
样例输出 Sample Output###
1 3
-1
2 3 6
数据范围及提示 Data Size & Hint###
对于 20%的数据,\(a,T<=10\) 。
对于 50%的数据,\(a,T<=1000\) 。
对于 100%的数据,\(1<=T<=200000,1<=a<=10^18\) 。
之前的一些废话###
题解###
考虑二进制数与三的倍数的关系。谈到二进制数是由若干个\(2^n\) 组成,分析其中一个\(2^n\) ,我们发现如果n是奇数的话,模\(3\) 等于$2 \(,\)n$ 为偶数模\(3\) 等于\(1\) ,如果若干个\(2^n\) 组成的话,我们就可以发现:(先定义奇数二进制为n为奇数的\(2^n\),偶数类似 )三个奇数二进制可以凑成三的倍数,三个偶的也可以凑成散的倍数,一个奇的一个偶的也可以凑成三的倍数。所以思路已经很清晰了:对于每一个输入进来的\(n\) ,首先分析它有多少个奇数二进制与多少个偶数二进制,然后根据以上配对原则选取不同的\(2^n\) 来贪心的拼凑三的倍数,可以发现至多只需要两个三的倍数即可凑成。
代码###
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
inline LL read()
{
LL x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int maxn=100010;
int T,even,odd,sum;
LL a,b,c,d,ji[70],ou[70];
int main()
{
freopen("three.in","r",stdin);
freopen("three.out","w",stdout);
T=(int)read();
while(T--)
{
a=read();sum=even=odd=0;b=c=0ll;
for(LL i=0;(1ll<<i)<=a;i++)
if(a&(1ll<<i))
{
sum++;
if(i%2)ji[++odd]=1ll<<i;
else ou[++even]=1ll<<i;
}
if(sum<2 || (odd==0 && even<3) || (even==0 && odd<3)){printf("-1\n");continue;}
if(a%3==0){printf("1 %lld\n",a);continue;}
if(odd && even)
{
for(int i=1;i<=min(odd,even);i++)b+=(ji[i]+ou[i]);
if(even>=3 && even>odd)
{
for(int i=odd+1;i<=even;i++)c+=(ou[i]);
if((even-odd)%3==1 && odd>1)c+=(ou[odd]+ou[odd-1]);
else if((even-odd)%3==1 && odd==1)c+=ji[1];
if((even-odd)%3==2)c+=ou[odd];
printf("2 %lld %lld\n",b,c);
continue;
}
else if(odd>=3 && odd>even)
{
for(int i=even+1;i<=odd;i++)c+=(ji[i]);
if((odd-even)%3==1 && even>1)c+=(ji[even]+ji[even-1]);
else if((odd-even)%3==1 && even==1)c+=ou[1];
if((odd-even)%3==2)c+=ji[even];
printf("2 %lld %lld\n",b,c);
continue;
}
else if(odd>even)
{
for(int i=even+1;i<=odd;i++)c+=(ji[i]+ou[i-even]);
printf("2 %lld %lld\n",b,c);
}
else if(odd<even)
{
for(int i=odd+1;i<=even;i++)c+=(ou[i]+ji[i-odd]);
printf("2 %lld %lld\n",b,c);
}
}
else if(even)
{
for(int i=1;i+3<=even;i+=3)b+=(ou[i]+ou[i+1]+ou[i+2]);
c=ou[even]+ou[even-1]+ou[even-2];
printf("2 %lld %lld\n",b,c);
continue;
}
else if(odd)
{
for(int i=1;i+3<=odd;i+=3)b+=(ji[i]+ji[i+1]+ji[i+2]);
c=ji[odd]+ji[odd-1]+ji[odd-2];
printf("2 %lld %lld\n",b,c);
continue;
}
}
return 0;
}
总结###
这种题重点在于缕清思路,一步步推还是比较好想的。事实证明我实在不适合这种分类讨论情况这么多的题,漏解了也很难发现,十分庆幸这是一道对拍十分好写的题,如果考试时候碰上这种难对拍的话,那就老老实实写50分做法吧。
NOIP模拟赛2(two)的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- Salesforce 开发整理(一)测试类最佳实践
在Sales force开发中完善测试类是开发者必经的一个环节,代码的部署需要保证至少75%的覆盖率,那么该如何写好测试类呢. 测试类定义格式如下: @isTest private class MyT ...
- vscode源码分析【一】从源码运行vscode
安装git,nodejs和yarn 安装Python27,3.x版本的不行,确保它在你的环境变量里: 安装gulp npm install --global gulp-cli 安装windows bu ...
- selenium爬取NBA并将数据存储到MongoDB
from selenium import webdriver driver = webdriver.Chrome() url = 'https://www.basketball-reference.c ...
- 你需要知道的OpenGL
它是谁? OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D.3D矢量图形的跨语言.跨平台的应用程序编程接口(API).这个接口由近3 ...
- 抓包工具之fiddler实战1-基本设置
Fiddler概述 百度搜索fiddler能找到官网网站,百度软件中心也提供了下载,本人去下载了基本和官网的版本一致,但还是建议大家下载软件一定去官网进行下载. Fiddler是干什么的 在百度百科里 ...
- RPA中房产证的 OCR 识别
客户需求,识别一些证件内容,包括身份证.户口本.营业执照.银行卡以及房产证,前四个比较容易实现,不管是艺赛旗的 RPA 还是百度的 OCR 都有接口,直接调用即可,但是都没有房产证的 OCR 识别,只 ...
- Think in Speed (关于速度的一点思考)
天下武功,无坚不摧,唯快不破!所以我们重视速度没毛病! 老话说:不要过早优化.赞同! 我们在写代码过程中,有时可能就是为了追求所谓的性能,然后,就给自己挖坑了. 关于开发速度,我有以下几点思考: 1. ...
- 学习Python前言
先介绍下自己: 我是小芒果,在一家互联网公司上班 目前担任的是测试工程师职 自工作开始至今,已经3年之载 一路过来倒也轻松 期间学过几次python没一次能坚持下来 随着行业的饱和 测试技术的要求 以 ...
- 苹果 iOS13.2.2 正式版修复闷杀后台问题了?别担心,PerfDog 帮你来检测!
导语 苹果于上周推送了iOS 13.2版本,带来了用户备受期待的图像处理系统深度融合(Deep Fusion),新增70多个表情.HomeKit安全视频.Siri隐私设置和支持AirPods Pro等 ...
- 【2019年版】如何向SAP公司提交Message?
[2019年版]如何向SAP公司提交Message? 1,浏览器里输入如下网址: ,出现如下界面, 2,点击 'Visit the SAP Support Portal' 按钮.进入如下界面,去菜单M ...