Codeforces Round #735 (Div. 2)
这次的cf依旧掉分.....
A题和B题在不懈死磕下瞎搞出来了,不过还是被C题卡住了...
简述题意就是给定n和m,让n^0,n^1,n^2...,n^m,求着m+1个数中没有出现过的最小的非负整数.假设答案为x,则n^k=x,则k>m,我们还可以转化成n^x=k>m,也就是说我们要找一个最小的数x使得n^x>m
若n>m,不难发现x为0就满足题意.之后考虑n<=m的情况:我们考虑一个数比另一个数大在二进制上是什么体现,比如x>y,那么我们把他们都写成二进制数,那么一定存在一个位数使得在这个位数之前x与y的二进制数是相等的,在这个位数上x>y,即x=1,y=0,只要满足这个条件,这个位数之后随意,x一定大于y,那我们考虑这里的n^k>m的情况,我们可以先把n和m写成二进制数,对于k来说,我们要求它尽可能小,但n^k必须大于m,那我们就考虑n^k要在哪一位上大于m,对于n和m的每一位,从m开始讨论,若m这一位为1,则n^k无论如何都无法在这一位上实现大于m的目标,并且我们要求n^k要大于m,那么在这一位上n^k也必须是1,期望在之后的某一位上大于m的目标,所以无论n的这一位是0还是1,我们的k的这一位与n、的这一位异或必须是1,这样的k的这一位就是确定的。若m的这一位是0,若n=1,可以发现k=0,n^k=1>0,即可完成超越m的目标并且k也没有增大,这是我们优先选择的目标,因为在某一位上超越m之后,后面的位数无论怎样都可以,所以这样的位(m=0,n=1)在越靠前,我们得到的k就越小,我们可以从最高位往下扫来确定有没有这样的位数。考虑m=.0,n=0的情况,我们有两种选择,将k赋为0,没有增加k的值,但却只能在后面超越m,还有一种选择就是令k=1,在这一位上选择超越m,之后的就不用考虑了,很显然,若有多个这样的位的话,我们肯定是让前面这样的位为0,在最后一个这样的位上为1超越m,因为k的二进制中1越在后面肯定越小。致此整个分析过程结束,我们只需要做如下操作。
首先从最高位往下扫,看有没有m=0,n=1的位,若有,从最高位到这一位,若m=1,我们令构造k使得n^k=1,若m=0,令k=0,结束。
若无m=0,n=1的位,从最低位到最高位扫,看有没有m=0,n=0的位,是第一个扫到的位终点,重新从最高位开始扫到终点,重复上面的赋值法则。
//不等,不问,不犹豫,不回头.
#include<bits/stdc++.h>
#define _ 0
#define ls p<<1
#define db double
#define rs p<<1|1
#define RE register
#define P 1000000007
#define ll long long
#define INF 1000000000
#define get(x) x=read()
#define PLI pair<ll,int>
#define PII pair<int,int>
#define ull unsigned long long
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(x,y,z) for(RE int x=y;x<=z;++x)
#define fep(x,y,z) for(RE int x=y;x>=z;--x)
#define go(x) for(RE int i=link[x],y=a[i].y;i;y=a[i=a[i].next].y)
using namespace std; inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
} int main()
{
// freopen("1.in","r",stdin);
int get(T);
while(T--)
{
int get(n),get(m);
if(n>m) {puts("0");continue;}
int id=-1,ans=0;
fep(i,30,0) //先找有没有m=0,n=1的位.
{
int s1=(m&1<<i)?1:0;
int s2=(n&1<<i)?1:0;
if(!s1&&s2) {id=i;break;}
}
if(id!=-1) //存在m=0,n=1的位数.
{
fep(i,30,id)
{
int s1=(m&1<<i)?1:0;
int s2=(n&1<<i)?1:0;
if(s1) ans+=(s1^s2)<<i;
}
}
else//不存在m=0,n=1的位数.
{
rep(i,0,30) //找最低位的m=0,n=0的位
{
int s1=(m&1<<i)?1:0;
int s2=(n&1<<i)?1:0;
if(!s1&&!s2) {id=i;break;}
}
fep(i,30,id)
{
int s1=(m&1<<i)?1:0;
int s2=(n&1<<i)?1:0;
if(s1) ans+=(s1^s2)<<i;
if(i==id) ans+=1<<i;
}
}
put(ans);
}
return (0^_^0);
}
//以吾之血,铸吾最后的亡魂.
Codeforces Round #735 (Div. 2)的更多相关文章
- Codeforces Round #735 (Div. 2) 题解
比赛地址:https://codeforces.com/contest/1554. 只有 ABCD 的题解,E 不会. A 答案是 \(\max_i\{a_ia_{i+1}\}\).证明:(反证)如果 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
随机推荐
- 288 day05_异常,线程
day05 [异常.线程] 主要内容 异常.线程 教学目标 [ ] 能够辨别程序中异常和错误的区别 [ ] 说出异常的分类 [ ] 说出虚拟机处理异常的方式 [ ] 列举出常见的三个运行期异常 [ ] ...
- CodeForce-791B Bear and Friendship Condition(并查集)
Bear Limak examines a social network. Its main functionality is that two members can become friends ...
- 每日学习——iframe标签伪造ajax
刚开始学习ajax,好难,看不懂啊看不懂. 伪造ajax加载网页 <!DOCTYPE html> <html> <head lang="en"> ...
- SourceTree使用详解-摘录收藏
前言: 非原创,好文收录,原创作者:追逐时光者 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Gi ...
- Windows系统中的SVN使用方法
Windows 下搭建 SVN(3.9版本)服务器 2018年08月11日 12:22:55 Amarao 阅读数 11984 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议, ...
- iSCSI 服务器搭建
一.简介 SCSI(Small Computer System Interface),小型计算机系统接口,是一种用于计算机及其周边设备之间(硬盘.软驱.光驱.打印机.扫描仪等)系统级接口的独立处理器标 ...
- P6880-[JOI 2020 Final]オリンピックバス【最短路】
正题 题目链接:https://www.luogu.com.cn/problem/P6880 题目大意 给出\(n\)个点\(m\)条边的有向图,边有边权和一个翻转权值. 翻转至多一条边使得\(1-& ...
- 转载 使用wce进行本地和域的hash注入
参数解释:-l 列出登录的会话和NTLM凭据(默认值)-s 修改当前登录会话的NTLM凭据 参数:<用户名>:<域名>:<LM哈希>:<NT哈希>-r ...
- 在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。 请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯();当N=9时呢?
在你面前有一个n阶的楼梯,你一步只能上1阶或2阶.请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯:当N=9时呢? 思路解析 ①台阶只有一级阶梯时,只有一种走法. ②当台阶有两级时,可以先走 ...
- GIT打补丁 - patch和diff应用
一. 准备工作: [root@guangzhou gittest]# git br * master [root@guangzhou gittest]# git chk -b patch-test1 ...