#include #include #include #include #include #ifndef K #define K 8 #endif #define UPBOUND 4096 unsigned short data[K]; unsigned char sumbuf[UPBOUND]; int level; int next_sum; struct Data{ unsigned value; unsigned short data[K]; bool operator<(const Data& d)const{ int i; if(valued.value)return false; for(i=K-1;i>=0;i--){ if(data[i]d.data[i])return false; } return false; } bool operator==(const Data& d)const{ int i; if(value!=d.value)return false; for(i=K-1;i>=0;i--){ if(data[i]!=d.data[i])return false; } return true; } }; std::vector dataset; void output() { Data d; int i; d.value = next_sum+data[K-1]; for(i=0;i=startv;--i){ push(i); search(i+1); pop(); } } int cur_best_size; int check(int s, int t) { int N=(dataset[s].value+dataset[t].value)/2; for(;N>=cur_best_size;N--){ memset(sumbuf,0,sizeof(sumbuf)); int i,j; for(i=0;ih){ int j; for(j=h+1;j<=dataset[i].value;j++)index_list[j]=i; h=dataset[i].value; } } index_list[h+1]=i; int s; for(s=2*max_value;s>=2*min_value&&s>=2*cur_best_size;s--){ int u,v;//enum for u+v=s u=min_value,v=s-u; if(v>max_value){ v=max_value;u=s-v; } for(;u<=max_value&&v>=u;u++,v--){ if(u==v){ int t1,t2; for(t1=index_list[u];t1