Codeforces 1748 D
这场D还是很有趣的,值得探讨。
首先是两个数,不相同时不太好做,所以我们能否找到一个,满足并且都是的倍数呢?
然后我们让特殊一些——我们先解决是奇数的问题。
只要包含中所有为的位,并且是的倍数就可以了,也就是并且。
那么若的第位为,我们可以让,这样是的倍数,并且由于的最后一位为(是奇数),可以保证的第位也是,并且不改变第位之前的数字。
程序实现就是下面这样子的:
for(ll i=0;i<30;i++) {
if(((a|b)&(1ll<<i))>=1) {
if((x&(1ll<<i))==0) {
x+=(1ll<<i)*d;
}
}
}
那么是偶数呢?此时的有一系列后缀。如果在这段内有,那么一定无解;否则我们可以先去除掉这些后缀,到最后输出答案时加上即可。
可以发现,是不超过的,故满足题中的条件。
时间复杂度为。
完整代码:
#include<bits/stdc++.h>
#define debug(...) std::cerr<<#__VA_ARGS__<<" : "<<__VA_ARGS__<<std::endl
using ll=long long;
void solve() {
ll a,b,d;
scanf("%lld%lld%lld",&a,&b,&d);
ll shift=0,res=0;
while(!(d&1ll)) d>>=1ll,shift++;
for(ll i=0;i<shift;i++) {
if((a&(1ll<<i))||(b&(1ll<<i))) {
printf("-1\n");
return;
}
}
a>>=shift; b>>=shift;
for(ll i=0;i<30;i++) {
if(((a|b)&(1ll<<i))>=1) {
if((res&(1ll<<i))==0) {
res+=(1ll<<i)*d;
}
}
}
printf("%lld\n",res<<shift);
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话