Xum题解

Xum

洛谷传送门

  • 题意:

    简化来说就是给你一个奇数 x,而你只能使用 +,让你构造出一个包含 1 的数集。

  • Analysis:

    首先为了得到 1,我们一般有两种思路,第一种是构造出 nn+1 这种“出解情况”,这种思路考场寄掉了,先咕。
    那么来说说正解思路:
    对于一个数 x,我们考虑它的运算集:“+”可以实现二进制数的左移操作,而 本身就是二进制操作,因此,我们考虑以下转移:

    说明:未知位用a代替,设二进制数长度为 k

    (1)1aaaaaaa1

    左移 k 位得:

    (2)1aaaaaaa100000000

    1 2 式得:

    (3)1aaaaaaa0aaaaaaa1

    3+ 2 式得:

    (4)1aaaaaaa10aaaaaaa1

    2 式自加后与 4 式得:

    (5)aaaaaaa1

    5 1 式即可得最高位:

    (6)100000000

  • 实现:

    经过上述分析,我们已经实现了消去最高位,接下来只要一直循环求解下去即可。

点击查看代码
#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;
}
posted @   Melting_Pot  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示