1 条题解

  • 0
    @ 2026-10-18 22:56:38

    [CSP-J 2020] 优秀的拆分

    知识点

    二进制、二进制位运算

    解题思路

    所有可选数均为偶数,因此奇数无解。偶数的二进制最低位为0,其余每个为1的位对应一个可选二次幂;从高位到低位输出这些幂。

    正确性说明

    二进制表示存在且唯一。偶数的非零位均不在第0位,得到的幂互不相同且和恰为n;奇数不可能由偶数求和得到。

    易错点

    2的0次幂不属于正整数次幂;输出顺序从大到小;不要把重复的2当作合法拆分。

    复杂度

    时间O(log n),额外空间O(1)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){int n;cin>>n;if(n&1){cout<<-1<<'\n';return 0;}
     bool first=true;for(int b=23;b>=1;--b)if(n&(1<<b)){if(!first)cout<<' ';cout<<(1<<b);first=false;}cout<<'\n';}
    
    • 1

    信息

    ID
    832
    时间
    1000ms
    内存
    256MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者