#include<iostream>
#include<cstdio>
#include<cstring>

namespace ShengXianTi
{
	const int N=301000,MOD=1000000007;
	inline void inc(int a,int &b){b=(a+b)%MOD;}

	int f[N][2][3][3];
	char s[N];
	int n;

	void dp()
	{
		s[n+1]='1',f[0][1][0][0]=1;

		for(int p=0;p<=n;p++)
			for(int r=0;r<2;r++)
				for(int k=0;k<3;k++)
					for(int sta=0;sta<3;sta++)
					{
						int v=f[p][r][k][sta];
						if(s[p+1]=='?' || s[p+1]=='0')
						{
							if(k==0)inc(v,f[p+1][r][1][sta]);
							else inc(v,f[p+1][r][k^3][sta]);
						}
						if(s[p+1]=='?' || s[p+1]=='1')
						{
							if(sta==2)
								inc(v,f[p+1][r^(k!=1)][0][sta]);
							else if(sta==1)
								inc(v,f[p+1][r^(k!=1)][0][sta+(r==0 && k==0)]);
							else if(sta==0)
								inc(v,f[p+1][r^(k!=1)][0][sta+(r==1 && k==0)]);
						}
					}
	}

	void solve()
	{
		scanf("%s",s+1);
		n=strlen(s+1);
		dp();

		int ans=0;
		inc(f[n+1][0][0][2],ans);
		inc(f[n+1][1][0][2],ans);
		printf("%d\n",ans);
	}
}

int main()
{
	ShengXianTi::solve();
	return 0;
}

#include<iostream>
#include<vector>
using namespace std;
const int MOD=1000000007;
void add(long long &a,long long b){a+=b;if(a>=MOD)a-=MOD;}

int H,W,K;
long long solve(){
    --K;
    vector<vector<long long> > dp(H+1,vector<long long>(W,0));
    dp[0][0]=1;
    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            for(int bit=0;bit<1<<(W-1);bit++){
                bool ok=true;
                for(int k=0;k<W-2;k++){
                    if((bit&(1<<k))&&(bit&(1<<(k+1)))) ok=false;
                }
                if(!ok)continue;
                int nj=j;
                if(bit&(1<<j))nj=j+1;
                else if(j>0&&(bit&(1<<(j-1))))nj=j-1;
                add(dp[i+1][nj],dp[i][j]);
            }
        }
    }
    return dp[H][K];
}

int main(){
    while(cin>>H>>W>>K)cout<<solve()<<endl;
}