因为只有二十四个数,并且答案唯一 , 所以可以将答案保存到ans数组中 #include <iostream> #include <cstring> using namespace std ; //以下为找答案的过程 //int a[1 << 24 ][25] ; //int n , c ; //double ans = 0 ; //int data[25][25] ; // //void printsubset( int n , int s ) //{ // for( int i = 0 ; i < n ; ++i ) // if( s & 1 << i ) // a[c][i] = 1 ; // else a[c][i] = 0 ; // c++ ; // return ; //} // //void subset( int n ) //{ // for( int i = 0 ; i < 1 << n ; ++i ) // printsubset( n , i ) ; // return ; //} // //void solve( int n ) //{ // if( n * ( n + 1 ) / 2 % 2 ) return ;//如果全部加起来是个奇数,说明不可能有答案 // c=0; // subset( n ) ;//找到有n个符号的所有子集,将其定为第一行的内容 // // for( int i = 0 ; i < c ; ++i ) // { // int num = n ; // memcpy( data[0] , a[i] , sizeof( data[0] ) ) ; // double cc1 = 0 , cc0 = 0 ;//统计零和一的个数 // for( int j = 0 ; j < n ; ++j ) // if( data[0][j] ) cc1++ ; // else cc0++ ; //生成符号三角形,用零和一代表加和减 // for( int j = 1 ; j < n ; ++j ) // { // for( int k = 0 ; k < n - j ; ++k ) // { // if( data[j-1][k] - data[j-1][k+1] ) // { // data[j][k] = 1 ; // cc1++ ; // } // else // { // data[j][k] = 0 ; // cc0++ ; // } // } // } // if( cc1 == cc0 )//如果零,一相等,个数为n的ans加一 // ans++ ; // } // // return ; //} // //int main() //{ // for( int i = 1 ; i <= 24 ; ++i ) // { // ans = 0 ; // solve( i ) ; // cout << ans << endl ; // } // return 0 ; //} //直接打表 int ans[] = {0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229} ; int main() { int n ; while( cin >> n ) { if( ! n ) break ; cout << n << " " << ans[n-1] << endl ; } return 0 ; }