#include <vector>
#include <cmath>
using namespace std;
static const unsigned MODVAL = 1000000007 ;
struct mint
{
unsigned val;
mint( ) : val( 0 ) { }
mint( int x) : val( x% MODVAL) { }
mint( unsigned x) : val( x% MODVAL) { }
} ;
mint& operator+ = ( mint& x, mint y) { return x = x.val + y.val ; }
class AlienAndSetDiv1 { public :
int getNumber( int N, int K)
{
memo.assign ( ( 1 << K) * ( N+ 1 ) * ( N+ 1 ) , - 1 ) ;
vector< int > A, B;
return rec( N, K, A, B, 0 ) ;
}
vector< int > memo;
int rec( size_t N, int K, vector< int > & A, vector< int > & B, int lastk)
{
if ( A.size ( ) == N && B.size ( ) == N)
return 1 ;
auto key = ( lastk* ( N+ 1 ) + A.size ( ) ) * ( N+ 1 ) + B.size ( ) ;
if ( memo[ key] >= 0 )
return memo[ key] ;
int next = A.size ( ) + B.size ( ) + 1 , nextmask = ( lastk & ~ ( 1 << ( K- 1 ) ) ) << 1 ;
int ai = A.size ( ) , bi = B.size ( ) ;
mint total = 0 ;
A.push_back ( next) ;
if ( A.size ( ) <= N && ( ai>= B.size ( ) || abs ( A[ ai] - B[ ai] ) >= K) )
total + = rec( N, K, A, B, nextmask) ;
A.pop_back ( ) ;
B.push_back ( next) ;
if ( B.size ( ) <= N && ( bi>= A.size ( ) || abs ( A[ bi] - B[ bi] ) >= K) )
total + = rec( N, K, A, B, nextmask| 1 ) ;
B.pop_back ( ) ;
return memo[ key] = total.val ;
}
} ;
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNtYXRoPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1PRFZBTCA9IDEwMDAwMDAwMDc7CnN0cnVjdCBtaW50CnsKCXVuc2lnbmVkIHZhbDsKCW1pbnQoKTp2YWwoMCl7fQoJbWludChpbnQgICAgICB4KTp2YWwoeCVNT0RWQUwpIHt9CgltaW50KHVuc2lnbmVkIHgpOnZhbCh4JU1PRFZBTCkge30KfTsKbWludCYgb3BlcmF0b3IrPShtaW50JiB4LCBtaW50IHkpIHsgcmV0dXJuIHggPSB4LnZhbCt5LnZhbDsgfQoKY2xhc3MgQWxpZW5BbmRTZXREaXYxIHsgcHVibGljOgoJaW50IGdldE51bWJlcihpbnQgTiwgaW50IEspCgl7CgkJbWVtby5hc3NpZ24oKDE8PEspKihOKzEpKihOKzEpLCAtMSk7CgkJdmVjdG9yPGludD4gQSwgQjsKCQlyZXR1cm4gcmVjKE4sIEssIEEsIEIsIDApOwoJfQoKCXZlY3RvcjxpbnQ+IG1lbW87CglpbnQgcmVjKHNpemVfdCBOLCBpbnQgSywgdmVjdG9yPGludD4mIEEsIHZlY3RvcjxpbnQ+JiBCLCBpbnQgbGFzdGspCgl7CgkJaWYoQS5zaXplKCk9PU4gJiYgQi5zaXplKCk9PU4pCgkJCXJldHVybiAxOwoKCQlhdXRvIGtleSA9IChsYXN0ayooTisxKStBLnNpemUoKSkqKE4rMSkrQi5zaXplKCk7CgkJaWYobWVtb1trZXldID49IDApCgkJCXJldHVybiBtZW1vW2tleV07CgoJCWludCBuZXh0ID0gQS5zaXplKCkrQi5zaXplKCkrMSwgbmV4dG1hc2sgPSAobGFzdGsgJn4gKDE8PChLLTEpKSk8PDE7CgkJaW50IGFpID0gQS5zaXplKCksIGJpID0gQi5zaXplKCk7CgoJCW1pbnQgdG90YWwgPSAwOwoKCQlBLnB1c2hfYmFjayhuZXh0KTsKCQlpZihBLnNpemUoKTw9TiAmJiAoYWk+PUIuc2l6ZSgpIHx8IGFicyhBW2FpXS1CW2FpXSk+PUspKQoJCQl0b3RhbCArPSByZWMoTiwgSywgQSwgQiwgbmV4dG1hc2spOwoJCUEucG9wX2JhY2soKTsKCQlCLnB1c2hfYmFjayhuZXh0KTsKCQlpZihCLnNpemUoKTw9TiAmJiAoYmk+PUEuc2l6ZSgpIHx8IGFicyhBW2JpXS1CW2JpXSk+PUspKQoJCQl0b3RhbCArPSByZWMoTiwgSywgQSwgQiwgbmV4dG1hc2t8MSk7CgkJQi5wb3BfYmFjaygpOwoKCQlyZXR1cm4gbWVtb1trZXldID0gdG90YWwudmFsOwoJfQp9Owo=
compilation info
prog.cpp: In member function ‘int AlienAndSetDiv1::rec(std::size_t, int, std::vector<int>&, std::vector<int>&, int)’:
prog.cpp:39:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(A.size()<=N && (ai>=B.size() || abs(A[ai]-B[ai])>=K))
^
prog.cpp:43:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(B.size()<=N && (bi>=A.size() || abs(A[bi]-B[bi])>=K))
^
/usr/lib/gcc/i486-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status
stdout