#include <bits/stdc++.h>
using namespace std;using ll=long long;using uint=unsigned int;using pii=pair<int,int>;using pll=pair<ll,ll>;using ull = unsigned long long;using ld=long double;template<typename T>void _(const char*s,T h){cerr<<s<<" = "<<h<<"\n";}template<typename T,typename...Ts>void _(const char*s,T h,Ts...t){int b=0;while(((b+=*s=='(')-=*s==')')!=0||*s!=',')cerr<<*s++;cerr<<" = "<<h<<",";_(s+1,t...);}// break continue pop_back 998244353
#define int ll
#define pii pll
#define f first
#define s second
#define pb emplace_back
#define forn(i,n) for(int i=0;i<(n);++i)
#define sz(a)((int)(a).size())
#define sqr(x) ((x)*(x))
struct init{init(){cin.tie(0);iostream::sync_with_stdio(0);cout<<fixed<<setprecision(10);cerr<<fixed<<setprecision(5);}~init(){
#ifdef LOCAL
#define dbg(...) _(#__VA_ARGS__,__VA_ARGS__)
cerr<<"Time elapsed: "<<(double)clock()/CLOCKS_PER_SEC<<"s.\n";
#else
#define dbg(...) 
#endif
}}init;template<typename T,typename U>void upx(T&x,U y){if(x<y)x=y;}template<typename T,typename U>void upn(T&x,U y){if(x>y)x=y;}mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());const int D=4,dx[]={+1,0,-1,0},dy[]={0,+1,0,-1};
 
const int32_t M=1e9+7;
int32_t rev(int32_t x,int32_t m){
    if(x==1)return 1;
    return (1-(ll)rev(m%x,x)*m)/x+m;
}
struct mint{
    int32_t x;
    mint():x(0){}
    mint(int32_t xx):x(xx%M){if(x<0)x+=M;}
    mint(ll xx):x(xx%M){if(x<0)x+=M;}
    mint& operator+=(mint b){if((x+=b.x)>=M)x-=M;return *this;}
    mint operator+(mint b){mint res=*this;res+=b;return res;}
    mint& operator-=(mint b){if((x-=b.x)<0)x+=M;return *this;}
    mint operator-(mint b){mint res=*this;res-=b;return res;}
    mint& operator*=(mint b){x=(ll)x*b.x%M;return *this;}
    mint operator*(mint b){mint res=*this;res*=b;return res;}
    mint inverse(){return rev(x,M);}
    mint& operator/=(mint b){x=(ll)x*rev(b.x,M)%M;return *this;}
    mint operator/(mint b){mint res=*this;res/=b;return res;}
    mint operator^(ll w) {mint r=1,a=*this;while(w){if(w&1)r*=a;a*=a;w/=2;}return r;}
    mint operator^=(ll w){return *this=(*this)^w;}
    mint operator^(mint w){return *this^w.x;}
    mint operator^=(mint w){return *this=(*this)^w;}
    mint operator-()const{return mint()-*this;}
    explicit operator bool()const{return x;}
    bool operator==(mint b){return x==b.x;}
};
istream&operator>>(istream&is,mint&p){istream&res=is>>p.x;p.x%=M;return res;}
ostream&operator<<(ostream&os,mint p){return os<<p.x;}
template<typename T>mint operator+(T x,mint y){return mint(x)+y;}
template<typename T>mint operator-(T x,mint y){return mint(x)-y;}
template<typename T>mint operator*(T x,mint y){return mint(x)*y;}
template<typename T>mint operator/(T x,mint y){return mint(x)/y;}
template<typename T>mint operator^(T x,mint y){return mint(x)^y;}
mint abs(mint x){return x;}
const int C=10101;
mint fc[C],ifc[C];
struct pc{pc(){
        fc[0]=1;
        for(int i=1;i<C;++i)fc[i]=fc[i-1]*i;
        ifc[C-1]=1/fc[C-1];
        for(int i=C-2;i>=0;--i)ifc[i]=ifc[i+1]*(i+1);
}}pc;
mint bin(int n,int k){
    if(k<0||k>n)return 0;
    return fc[n]*ifc[k]*ifc[n-k];
}
mint cat(int n){if(n<0)return 0;return bin(n+n,n)-bin(n+n,n-1);}
const int N=5050;
// mint c[N],f[N][N],g[N][N];
// int dp[303][303][303];
mint dp[N][N];
int32_t main(){
    int n;string s;
    cin>>n>>s;
    dp[0][0]=1;
    for(int i=1;i<=n;++i){
        forn(j,n+1){
            if(j)dp[i][j]+=dp[i-1][j-1]*2;
            dp[i][j]+=dp[i-1][j+1];
            if(!j)dp[i][j]+=dp[i-1][j];
        }
    }
    int z=sz(s);
    cout<<dp[n][z]/(mint(2)^z)<<'\n';
    // for(int i=2;i<=n;i+=2)c[i]=cat(i/2-1);
    // for(int i=1;i<=n;++i)f[1][i]=cat(i-1);
    // f[0][0]=1;
    // for(int i=1;i<=n;++i)f[1][i]=cat(i-1);
    // for(int i=2;i<=n;++i)f[2][i]=cat(i-1);
    // for(int i=3;i<=n;++i)
    //     for(int j=0;j<=n;++j)
    //         f[i][j]=f[i-1][j]-f[i-2][j-1];
    
    // dp[0][0][0]=1;
    // for(int i=1;i<=n;++i){
    //     for(int j=0;j<=n;++j){
    //         for(int k=0;k<=n;++k){
    //             if(j==0&&k==0)dp[i][j][k]=dp[i-1][1][0]+dp[i-1][0][1]+dp[i-1][0][0];
    //             else if(k==0) dp[i][j][k]=dp[i-1][j-1][0]+dp[i-1][j+1][0]+dp[i-1][j][1];
    //             else if(k==1) dp[i][j][k]=dp[i-1][j][k-1]+dp[i-1][j][k+1];
    //             else          dp[i][j][k]=dp[i-1][j][k-1]*2+dp[i-1][j][k+1];
    //             dp[i][j][k]%=M;
    //         }
    //     }
        // for(int j=0;j<=0;++j)cerr<<dp[i][j][0]<<' ';
        // cerr<<'\n';
    // }
    // cout<<dp[n][sz(s)][0]<<'\n';
    return 0;
}

Measured memory_bytes: 103376