#include #include #define ll long long using namespace std; int n,k; const int MOD = 1000000007; ll binom[2222][2222]; char S[2222]; ll dp[1222][1222][2]; ll pow2m[1222]; ll smaller(int pos, int has, int isok) { if(pos == n) { return has == k && isok; } if(dp[pos][has][isok] == -1) { ll& ans = dp[pos][has][isok]; ans = 0; if(S[pos] == '0') { if(isok) ans = smaller(pos+1, has+1, isok); ans += smaller(pos+1, has, isok); } else { ans = smaller(pos+1, has, 1); ans += smaller(pos+1, has+1, isok); } ans %= MOD; } return dp[pos][has][isok]; } string S2() { string res; int carry = 1; for(int i = n-1; i >= 0; i--) { int x = carry+(S[i]-'0')+1; carry = x/2; res.push_back((x%2)+'0'); } if(carry) res.push_back('1'); reverse(res.begin(), res.end()); return res; } int main() { memset(dp, -1, sizeof(dp)); scanf("%d%d", &n, &k); scanf("%s", S); pow2m[0] = 1; for(int i = 1; i < 1222; i++) pow2m[i] = (pow2m[i-1]*2)%MOD; binom[1][0] = 1; binom[1][1] = 1; for(int i = 2; i <= 1200; i++) { binom[i][0] = binom[i][i] = 1; for(int j = 1; j < i; j++) binom[i][j] = (binom[i-1][j-1]+binom[i-1][j])%MOD; } ll t1 = smaller(0, 0, 0); memset(dp, -1, sizeof(dp)); string Sx = S2(); for(int i = 0; i < Sx.size(); i++) S[i] = Sx[i]; if(n != Sx.size()) n++; ll t2 = smaller(0, 0, 0); // printf("%s\n", S2().c_str()); // printf("%lld %lld\n", t1, t2); ll ans = ((t2-t1)%MOD+MOD)%MOD; printf("%lld\n", ans); // ll res = /*binom[n][k]; if(S[0] == '1') { res = (binom[n][k]+binom[n][k-1])%MOD; } scanf("%s", S); printf("%lld\n", res); printf("%lld\n", smaller(0, 0, 0)); res = (res-smaller(0, 0, 0)+MOD)%MOD; printf("%lld\n", res); */ return 0; }