#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 ; }
template < typename T>
struct DP3
{
int N1, N2, N3;
vector< T> data;
DP3( int N1, int N2, int N3, const T& t = T( ) )
: N1( N1) , N2( N2) , N3( N3) , data( N1* N2* N3, t) { assert ( data.size ( ) * sizeof ( T) < ( 1 << 28 ) ) ; }
T& operator( ) ( int i1, int i2, int i3)
{ return data[ ( ( i1* N2) + i2) * N3+ i3 ] ; }
void swap( DP3& rhs)
{ data.swap ( rhs.data ) ; }
} ;
class AlienAndSetDiv1 { public :
int getNumber( int N, int K)
{
const int MASK = ( 1 << K) - 1 ;
DP3< mint> dp( N+ 1 , N+ 1 , 1 << K) ; // |A|, |B|, last K
dp( 0 ,0 ,0 ) = 1 ;
for ( int a_plus_b= 0 ; a_plus_b< 2 * N; ++ a_plus_b)
for ( int a= 0 ; a<= N; ++ a) {
int b = a_plus_b - a;
if ( 0 <= b && b<= N) {
for ( int m= 0 ; m< ( 1 << K) ; ++ m) {
int me = a+ b+ 1 ;
if ( a< N) {
int you = calc_Bs_elem( a, b, m) ;
if ( abs ( you- me) >= K)
dp( a+ 1 , b, MASK& ( ( m<< 1 ) | 0 ) ) + = dp( a,b,m) ;
}
if ( b< N) {
int you = calc_Bs_elem( b, a, m^ MASK) ;
if ( abs ( you- me) >= K)
dp( a, b+ 1 , MASK& ( ( m<< 1 ) | 1 ) ) + = dp( a,b,m) ;
}
}
}
}
mint sum = 0 ;
for ( int m= 0 ; m< ( 1 << K) ; ++ m)
sum + = dp( N, N, m) ;
return sum.val ;
}
int calc_Bs_elem( int a, int b, int m)
{
int next_idx = b- 1 ;
int v = a+ b;
for ( int i= 0 ; ( 1 << i) <= m; ++ i) {
if ( ( 1 << i) & m) {
if ( next_idx == a)
return v;
next_idx-- ;
}
-- v;
}
return - 99999 ;
}
} ;
I2luY2x1ZGUgPHZlY3Rvcj4gCiNpbmNsdWRlIDxjbWF0aD4gCnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1PRFZBTCA9IDEwMDAwMDAwMDc7IApzdHJ1Y3QgbWludCAKeyAKICB1bnNpZ25lZCB2YWw7IAogIG1pbnQoKTp2YWwoMCl7fSAKICBtaW50KGludCAgICAgIHgpOnZhbCh4JU1PRFZBTCkge30gCiAgbWludCh1bnNpZ25lZCB4KTp2YWwoeCVNT0RWQUwpIHt9IAp9OyAKbWludCYgb3BlcmF0b3IrPShtaW50JiB4LCBtaW50IHkpIHsgcmV0dXJuIHggPSB4LnZhbCt5LnZhbDsgfSAKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IApzdHJ1Y3QgRFAzIAp7IAogIGludCBOMSwgTjIsIE4zOyAKICB2ZWN0b3I8VD4gZGF0YTsgCiAgRFAzKGludCBOMSwgaW50IE4yLCBpbnQgTjMsIGNvbnN0IFQmIHQgPSBUKCkpIAogICAgOiBOMShOMSksIE4yKE4yKSwgTjMoTjMpLCBkYXRhKE4xKk4yKk4zLCB0KSB7IGFzc2VydChkYXRhLnNpemUoKSpzaXplb2YoVCk8KDE8PDI4KSk7IH0gCiAgVCYgb3BlcmF0b3IoKShpbnQgaTEsIGludCBpMiwgaW50IGkzKSAKICAgIHsgcmV0dXJuIGRhdGFbICgoaTEqTjIpK2kyKSpOMytpMyBdOyB9IAogIHZvaWQgc3dhcChEUDMmIHJocykgCiAgICB7IGRhdGEuc3dhcChyaHMuZGF0YSk7IH0gCn07IAoKY2xhc3MgQWxpZW5BbmRTZXREaXYxIHsgcHVibGljOiAKICBpbnQgZ2V0TnVtYmVyKGludCBOLCBpbnQgSykgCiAgeyAKICAgIGNvbnN0IGludCBNQVNLID0gKDE8PEspLTE7IAogICAgRFAzPG1pbnQ+IGRwKE4rMSwgTisxLCAxPDxLKTsgLy8gfEF8LCB8QnwsIGxhc3QgSyAKCiAgICBkcCgwLDAsMCkgPSAxOyAKICAgIGZvcihpbnQgYV9wbHVzX2I9MDsgYV9wbHVzX2I8MipOOyArK2FfcGx1c19iKSAKICAgIGZvcihpbnQgYT0wOyBhPD1OOyArK2EpIHsgCiAgICAgIGludCBiID0gYV9wbHVzX2IgLSBhOyAKICAgICAgaWYoMDw9YiAmJiBiPD1OKSB7IAogICAgICAgIGZvcihpbnQgbT0wOyBtPCgxPDxLKTsgKyttKSB7IAogICAgICAgICAgaW50IG1lID0gYStiKzE7IAogICAgICAgICAgaWYoYTxOKSB7IAogICAgICAgICAgICBpbnQgeW91ID0gY2FsY19Cc19lbGVtKGEsIGIsIG0pOyAKICAgICAgICAgICAgaWYoYWJzKHlvdS1tZSkgPj0gSykgCiAgICAgICAgICAgICAgZHAoYSsxLCBiLCBNQVNLJigobTw8MSl8MCkpICs9IGRwKGEsYixtKTsgCiAgICAgICAgICB9IAogICAgICAgICAgaWYoYjxOKSB7IAogICAgICAgICAgICBpbnQgeW91ID0gY2FsY19Cc19lbGVtKGIsIGEsIG1eTUFTSyk7IAogICAgICAgICAgICBpZihhYnMoeW91LW1lKSA+PSBLKSAKICAgICAgICAgICAgICBkcChhLCBiKzEsIE1BU0smKChtPDwxKXwxKSkgKz0gZHAoYSxiLG0pOyAKICAgICAgICAgIH0gCiAgICAgICAgfSAKICAgICAgfSAKICAgIH0gCgogICAgbWludCBzdW0gPSAwOyAKICAgIGZvcihpbnQgbT0wOyBtPCgxPDxLKTsgKyttKSAKICAgICAgc3VtICs9IGRwKE4sIE4sIG0pOyAKICAgIHJldHVybiBzdW0udmFsOyAKICB9IAoKICBpbnQgY2FsY19Cc19lbGVtKGludCBhLCBpbnQgYiwgaW50IG0pIAogIHsgCiAgICBpbnQgbmV4dF9pZHggPSBiLTE7IAogICAgaW50IHYgPSBhK2I7IAogICAgZm9yKGludCBpPTA7ICgxPDxpKTw9bTsgKytpKSB7IAogICAgICBpZigoMTw8aSkmbSkgeyAKICAgICAgICBpZihuZXh0X2lkeCA9PSBhKSAKICAgICAgICAgIHJldHVybiB2OyAKICAgICAgICBuZXh0X2lkeC0tOyAKICAgICAgfSAKICAgICAgLS12OyAKICAgIH0gCiAgICByZXR1cm4gLTk5OTk5OyAKICB9IAp9Ow==
compilation info
prog.cpp: In instantiation of ‘DP3<T>::DP3(int, int, int, const T&) [with T = mint]’:
prog.cpp:32:32: required from here
prog.cpp:21:87: error: ‘assert’ was not declared in this scope
: N1(N1), N2(N2), N3(N3), data(N1*N2*N3, t) { assert(data.size()*sizeof(T)<(1<<28)); }
^
stdout