Xum题解
Xum
洛谷传送门
-
题意:
简化来说就是给你一个奇数 ,而你只能使用 或 ,让你构造出一个包含 的数集。
-
Analysis:
首先为了得到 ,我们一般有两种思路,第一种是构造出 与 这种“出解情况”,这种思路考场寄掉了,先咕。
那么来说说正解思路:
对于一个数 ,我们考虑它的运算集:“”可以实现二进制数的左移操作,而 本身就是二进制操作,因此,我们考虑以下转移:说明:未知位用a代替,设二进制数长度为 。
左移 位得:
式 式得:
式 式得:
式自加后与 式得:
式 式即可得最高位:
-
实现:
经过上述分析,我们已经实现了消去最高位,接下来只要一直循环求解下去即可。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define lowbit(x) (x&(-x))
int x;
struct Node{
int opt,x,y;
};
vector<Node> putout;
int solve(int x){
int y=x,ans=x>>1;
while(ans){
putout.push_back((Node){1,y,y});
y<<=1;
ans>>=1;
}
int z=x^y;
putout.push_back((Node){2,x,y});
int r=y+z;
putout.push_back((Node){1,y,z});
int s=y+y;
putout.push_back((Node){1,y,y});
int t=r^s;
putout.push_back((Node){2,r,s});
int u=t^x;
putout.push_back((Node){2,t,x});
while(y!=lowbit(y)){
if(y&u){
putout.push_back((Node){2,y,u});
y^=u;
}
putout.push_back((Node){1,u,u});
u+=u;
}
putout.push_back((Node){2,x,y});
x^=y;
return x;
}
signed main(){
scanf("%lld",&x);
while(x!=1) x=solve(x);
printf("%lld\n",putout.size());
for(int i=0;i<putout.size();i++){
if(putout[i].opt==1) printf("1 %lld %lld\n",putout[i].x,putout[i].y);
else if(putout[i].opt==2) printf("2 %lld %lld\n",putout[i].x,putout[i].y);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具