Upload
vlad-stoian
View
2
Download
0
Embed Size (px)
DESCRIPTION
Algoritm in C++; urmeaza a fi imbunatatit
Citation preview
#include<fstream>
#include<cmath>
#include<iostream>
using namespace std;
ifstream fin("hercule.in");
ofstream fout("hercule.out");
int putere(int a, int b){
int p;
p=1;
if(b==0)
p=1;
else
while(b!=0){
p=p*a;
b-=1;
}
return p;
}
int main (){
int T;
fin>>T;
for(int l=1; l<=T; l++) {
int k;
fin>>k;
int v[1000000005];
for(int j=1; j<=k; j++)
v[k]=0;
double a;
a = (log(k)*1.0)/log(2);
// caz particular 2^a
if ( int(a) == a)
for(int p=0; p<=a-1; p++)
v[putere(2,p)] = 1;
a=int (a);
for(int p=0; p<=a-1; p++)
v[putere(2,p)] = 1;
int b;
int c;
c = int(a);
b=k-putere(2,c);
cout<<b<<" ";
v[b]=1;
for(int i=0; i<=c-1; i++)
if(b==putere(2,i))
{
v[b]=0;
for(int j=1; j <= putere(2, c-2)-1; j++)
if(putere(2,c-1)+j+b<k)
if (v[putere(2,c-1)-j] == 0 && v[putere(2,c-1)+j+b]== 0)
{
v[putere(2,c-1)-j] = 1;
v[putere(2, c-1)+j+b] = 1;
break;
}
}
int sum=1;
int taieturi=0;
for(int i=1; i<=k; i++)
if(v[i]==1)
{
sum += i;
taieturi++;
}
if (sum==k)
{
fout<<taieturi<<'\n';
for(int i=1; i<=k; i++)
if(v[i]==1)
fout << i << " ";
}
else fout<<"-1";
fout<<'\n';
}
}