Skip to main content
Original122 words1 min

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

Summary

把 n 拆成若干个互不相同的 2 的正整数次幂之和,按从大到小输出,无法拆分时输出 -1。2 的正整数次幂都是偶数,奇数无法由偶数相加得到,故 n 为奇数时无解;n 为偶数时其二进制最低位为 0,其余每个为 1 的二进制位恰对应一个 2 的正整数次幂,从最高位起依次取出对应的值输出并减去即可。

解题思路​

显然 22 的正整数次幂都是偶数,多个偶数相加不可能得到奇数。因此 nn 为奇数时无解,输出 -1。

若 nn 为偶数,则它的二进制最低位为 00,而二进制第 ii 位(i>0i>0)刚好对应 22 的 ii 次幂。

因此用 1<<31-__builtin_clz(n) 取出当前 nn 的二进制最高位对应值,从大到小依次输出并减去即可。

参考代码​

255 Bcpp
#include <bits/stdc++.h>
using namespace std;

int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
if(n&1)
{
cout<<-1<<'\n';
return 0;
}
while(n)
{
int t=1<<31-__builtin_clz(n);
cout<<t<<' ';
n-=t;
}
return 0;
}