PALSUM - Editorial

Can you help me to find what’s wrong in this program. My approach was 2^m(where m-[0,9]), In binary representation (1,11,101,1001,10001,100001…). These are palindrome and reducing these palindrome numbers to the original number(n) until n becomes 0.

import math
T=int(input())
for t in range(T):
    n=int(input())
    if(n<=0):
        print(0)
        print(0)
        break
    index=0
    ans=[]
    while(n>0):
        for i in range(11):
            if(2**i+1>=n):
                index=i-1
                break
        ans.append(math.floor(2**index)+1)
        n=n-((2**index)+1)
    print(len(ans))
    for i in range(len(ans)):
        print(ans[i],end=' ')
    print()

Thank You!

#include<bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
while(T → 0){
int N;
int array[12] = {0};
cin >> N;
int total = N;
int result = 0;
int i = 0;
while(total>1){
result = log2(total);
int num = pow(2,result)-1;
array[i] = num;
total = total - num;
i++;
}
if(total==1)
array[i] = 1;
for(int j=0;j<=i && array[j] != 0;j++){
cout << array[j];
if(j<=i-1){
cout << " ";
}
}
cout << endl;
}
}

where am I incorrect…?
I used the logic 2^n - 1 is always palindromic

my approach

#include<bits/stdc++.h>
using namespace std;
#define int long long int

int powerOfTwo(int n)
{
    return n && (!(n & (n-1)));
}
int highestPowerof2(int n)
{
    int res = 0;
    for (int i=n; i>=1; i--)
    {
        if ((i & (i-1)) == 0)
        {
            res = i;
            break;
        }
    }
    return res;
}
 
int32_t main() {
    ios::sync_with_stdio(false);
	cin.tie(NULL);
	int t;
	cin>>t;
	while(t--){
	    int n;
	    cin>>n;
	    vi elements;
	    while(n>=1)
	    {
	        if(n>1)
	        {
	        int ele = highestPowerof2(n);
	           if(powerOfTwo(ele))
	           {
	            n = n-(ele-1);elements.pb(ele-1);
	           }
	        }
	        else
	        {
	            elements.pb(1);
	            n = 0;
	        }
	    }
	    cout<<elements.size()<<"\n";
	    for (auto i : elements) {
	        cout<<i<<" ";
	    }
	    cout<<"\n";
	}
	return 0;
}

Greedy solution:

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

int main() {
  const int MX = 1000;
  vector<int> good; // stores all good numbers in [1, 1000]

  for (int i = 1; i <= MX; i++) {
    bool ok = 1; // check if 'i' is palindrome
    for (int len = 32 - __builtin_clz(i), j = 0; j < len / 2; j++) {
      ok &= (i >> j & 1) == (i >> (len - j - 1) & 1);
    }

    if (ok) good.push_back(i);
  }


  int tc;
  for (cin >> tc; tc; tc--) {
    int n, now = 0;
    cin >> n;

    vector<int> ans;
    while (now < n) {
      int dif = n - now;
      auto it = upper_bound(good.begin(), good.end(), dif);
      it--;

      now += *it;
      ans.push_back(*it);
    }
    
    assert((int) ans.size() <= 12);
    assert(now == n);
    cout << ans.size() << '\n';
    for (int i = 0; i < (int) ans.size(); i++) {
      cout << ans[i] << ' ';
    }
    cout << '\n';
  }
  return 0;
}