题解:P7071 [CSP-J2020] 优秀的拆分

· · 题解

作者:Igallta。(813622)

请勿抄袭。

思路

二进制操作题。

首先,根据题意,如果给定的 n 是奇数那么直接输出 -1

然后,根据题意就可以发现是要把 n 拆成 2^{a_1}+2^{a_2}+...2^{a_x} 这种形式。

看到这个,你会想到什么?是不是特别像二进制转十进制的计算方式?

也就是说我们从大到小找到 n 的二进制为 1 的位并输出那一位对应的十进制不就行了?

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
signed main(){
    ios::sync_with_stdio(0);
    cin>>n;
    if(n&1)cout<<-1;
    else{
        for(int i=32;i>=1;i--){
            if(n&(1<<i)){
                cout<<(1<<i)<<' ';
            }
        }
    }
    return 0;
}