CF1748D ConstructOR 题解
题目大意
给定 ,要求找到一个 ,满足 都是 的倍数( 代表按位或)。
,
题目解析
乍一看没什么思路,赛时想了很久才做出来。
显然当 的最低位的 比 的最低位还要低的时候,无解。
首先我们发现要让两个数字都是 的倍数就很麻烦,所以我们可以试着让这两个数字变成一个数字。
设 ,那么其实只要让 并且 是 的因数就可以了。
因为 ,所以不难发现 的一些位必定为 。
从低位到高位考虑 的每一个限制。如果当前 的这一位是 ,但是 的这一位是 ,那么我们就把 的最低位的 通过移位操作和这一位对齐,然后加上移位后的数字,这样这一位就是 了。
因为 所以这样构造出来的 满足 ,一定合法。
时间复杂度
ll a,b,c,d,ans; int cnt; void work(){ a=read(); b=read(); c=a|b; d=read(); ans=0; int i; cnt=0; for(i=0;i<30;i++) if(d&(1<<i)){ cnt=i; break; } for(i=0;i<30;i++) if((c&(1<<i))&&!(ans&(1<<i))){ if(i<cnt){ puts("-1"); return; } ans+=(d<<(i-cnt)); } print(ans),pc('\n'); assert((a|ans)%d==0&&(b|ans)%d==0); return; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具