C. Interesting Sequence
传送门
题意:给你一个n和x,问你是否存在一个m,使
n&(n+1)&(n+2)&...&m=x如果存在输出最小的m,否则输出-1。
思路:因为是与运算,那么与之后的结果一定不会大于n,所以如果m>n就可以直接输出-1.
而且数据范围比较大,那么我们可以把n转化为二进制数。
假如是90转换为二进制数就是1011010,
&n+1即1011010&1011011=1011010,
&n+2即1011010&1011100=1011000,
&n+3即1011000&1011101=1011000,
&n+4即1011000&1011110=1011000,
&n+5即1011000&1011111=1011000,
&n+6即1011000&1100000=1000000,
好那么到这里我们可以发现,每次与的结果只能为从高位开始的1的连续子区间的前缀
(比如1011010可以得到1011000但是不能得到1000010(如果要前面的1为0那么后面的1一定会提前为0)
也不能得到1010000(如果要第三个位置为1第四个为0那么与的数第四个位置也要为0,但是如果为0那么就会进位导致第三位置的1也会0))
并且,而且二进制数如果x中为1但是n不为1那么无论怎么加也不能使当前位为1.
于是不能得到的情况就处理完了,现在就看如何得到最小的m。
那么我们也可以从上图发现,最小的m就是从高到低起,x的二进制位和n的二进制不同的i前面一位(比如要得到1000000,那么与1011000不同位为第3位,那么就要往前挪一位&1100000就可以得到)。
代码:
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;const int N=1000000+100;
ll n ,m,h;
int a[N],b[N];void solve()
{for(int i =1;i<=70;i++)//初始化a[i]=b[i]=0;ll x,y;cin>>x>>y;n=x,m=y;if(m>n){cout<<"-1\n";return ;} if(m==n){cout<<m<<endl;return ;}int sizea=1,sizeb=1;for(int i =1;i<=70;i++)//从小到大转换为二进制到数组里面{if(n%2){a[i]=1;sizea=i;}if(m%2){b[i]=1;sizeb=i;}n/=2,m/=2;} bool ii=0;for(int i =max(sizea,sizeb);i>=1;i--){if(a[i]!=b[i]){if(b[i]){cout<<"-1\n";return ; }else ii=1;//前缀只能到这个位置}else{if(a[i]==1&&ii) //后面有1并且前面有0了{cout<<"-1\n";return ; }}}for(int i =max(sizea,sizeb);i>=1;i--)//找连续的1的区间{int j=i;if(a[j]==1){int sum=0;while(a[j]==1){if(b[j]==0&&j>=1) sum++;j--;}if(sum!=i-j&&sum!=0){cout<<"-1\n";return ; }}i=j;}for(int i =max(sizea,sizeb);i>=1;i--)//从最高位找不同的{if(a[i]!=b[i]&&a[i]==1){b[i+1]=1;break;}}ll res=0,t=1;for(int i =1;i<=70;i++) {if(b[i]==1)res+=t;t*=2;}cout<<res<<endl;return ;
}int main()
{int t;sc_int(t);while(t--)solve();return 0;
}/*101010
011111
1010 1011 1100 1101 1110 11111010
1000*/
C. Interesting Sequence相关推荐
- 【CF 比赛记录】Roye_ack的艰难上分日常(35)
目录 #792 Div1+Div2 AC A1. Digit Minimization #Edu 129 Div2 !A2. Game with Cards #795 Div2 AC A3. Be ...
- The 2022 ICPC Asia Regionals Online Contest (II) A、B、E、F、G、J、L
文章目录 A-Yet Another Remainder 题目 题解 B-Non-decreasing Array 题目 题解 E-An Interesting Sequence 题目 题解 F-In ...
- The 2022 ICPC Asia Regionals Online Contest (II) 2022ICPC第二场网络赛 ABEFGJKL题解
文章目录 A Yet Another Remainder[费马小定理] B Non-decreasing Array[线性DP] E An Interesting Sequence[签到] F Inf ...
- Codeforces Round #843 (Div. 2) 口胡日记(青大蒟蒻日常掉大分)
我的主页 A1. Gardener and the Capybaras (easy version) 思路 O(n2)暴力,枚举分裂成三部分的两个断点,提取三个部分,按照题意模拟即可. A1题代码 A ...
- I - Interesting Permutation Gym - 102394I(排列组合)
题意: 纯数题 1≤i≤n, fi=max{a1,a2,-,ai}; 1≤i≤n, gi=min{a1,a2,-,ai}; 1≤i≤n, hi=fi−gi. 数列a是一个排列,问多少种排列方式满足h数 ...
- UVA10534 Wavio Sequence【LIS+DP】
Wavio is a sequence of integers. It has some interesting properties. • Wavio is of odd length i.e. L ...
- Gym - 102394I Interesting Permutation(思维)
题目链接:https://vjudge.net/contest/398708#problem/I DreamGrid has an interesting permutation of 1,2,-,n ...
- ZOJ 3952 Fibonacci Sequence Chicken Edition
Year 2017 is the year of chicken, so in this problem we introduce you an interesting programming lan ...
- Day 12 C. Interesting Story
Problem: Stephen Queen wants to write a story. He is a very unusual writer, he uses only letters 'a' ...
最新文章
- Python---哈夫曼树---Huffman Tree
- 接口测试 2021 接口测试白皮书 欢迎下载阅读
- MYSQL.版本查看-LINUX
- Linux 下搭建 Scala 开发环境
- 关于scanf和的问题
- 二叉树的相关操作(c语言)
- POJ1426-Find The Multiple-深度优先搜索BFS
- 关于java 中 的 null。
- PHICOMM(斐讯)N1盒子 - recovery模式救砖卡登录页LOGO卡1%卡4%卡26%
- 战投之王:蔡崇信、刘炽平和刘德的精密战争
- mysql 删除数据后myd_关于mysql 删除数据后(.MYD,MYI)物理空间未释放
- termux搭建局域网web服务器
- 手机查看企业qq邮件服务器,QQ企业邮箱怎么用?手机QQ邮箱收发邮件的方法
- R语言dplyr入门到进阶
- FTT暴雷加密熊市雪上加霜?如何对抗系统风险
- 快速提高pip安装速度!一劳永逸
- lt;html xmlns=http://www.w3.org/1999/xhtmlgt;
- Statistics Foundations: 2 统计基础:2 Lynda课程中文字幕
- 模板模式详解、模板模式怎么用、模板模式模板代码
- 【LTE基础知识】LTE信令流程之开机附着、去附着流程分析
热门文章
- Python爬虫:逆向分析某云音乐加密参数
- licode服务器处理流程
- 用Python写前端是什么体验?
- iOS 学习之旅 - OC 篇
- Node.js 单页应用
- android 位于底部的tab,GitHub - DevinFu/BottomTabBar: Android应用中位于底部的tab栏
- pathlib库使用手册
- php printer.dll扩展,php_printer.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
- C++学习(二一一)英伟达和七彩虹
- sunos与linux区别,linux与solaris的联系与区别总结:命令的异同