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

· · 题解

我采用了递归的写法,相对比较直观。

#include<bits/stdc++.h>
using namespace std;
int n;
int p[40]={0,2,4,8,16,32,64,128,256,512,1024,2048,\
4096,8192,16384,32768,65536,131072,262144,524288,\
1048576,2097152,4194304,8388608,16777216,33554432,\
67108864,134217728,268435456,536870912,1073741824};
void f(int x){
    if(x==1||x==0) return;
    for(int i=30;i>=1;i--){
        if(x>=p[i]){
            cout<<p[i]<<" ";
            f(x-p[i]);
            break;
        }
    }
}
int main()
{
    cin>>n;
    if(n%2==1){
        cout<<-1<<endl;
        return 0;
    }
    else{
        f(n);
    }
}