#include #define REP(i, n) for(int (i)=0;(i)<(n);(i)++) #define MOD 1000000007 #define LL long long using namespace std; char arr[2000]; int n = 0; LL dp[2000][2000][2] = {}; LL get(int, int, int); LL calc(int i, int j, int k){ if (j == 0) { if (k == 0) { if (arr[n-i] == '0') return get(i-1, j, 0); else return 0; } else { if (arr[n-i] == '0') return get(i-1, j, 1); else return get(i-1, j, 1) + get(i-1, j, 0); } } if (k == 0) { if (arr[n-i] == '0') return get(i-1, j, 0) + get(i-1, j-1, 0) + get(i-1, j-1, 1); else return get(i-1, j-1, 0); } else { if (arr[n-i] == '0') return get(i-1, j, 1); else return get(i-1, j, 1) + get(i-1, j, 0) + get(i-1, j-1, 1); } } LL get(int i, int j, int k){ return dp[i][j][k] % MOD; } int main(){ dp[0][0][0] = 1; int k; cin >> n >> k; cin >> arr; // for(int i=1; i<2000; i++){ // if (arr[n-1-i] == '0') { // dp[i][0][0] = dp[i-1][0][0]; // dp[i][0][1] = dp[i-1][0][0]; // } else { // dp[i][0][0] = 0; // dp[i][0][1] = 1; // } // } if(arr[n-1] == '0') { dp[1][0][0] = 1; dp[1][0][1] = 0; dp[1][1][0] = 1; dp[1][1][1] = 0; } else { dp[1][0][0] = 0; dp[1][0][1] = 1; dp[1][1][0] = 1; dp[1][1][1] = 0; } for(int i=2; i<=n; i++){ for(int j=0; j<=i; j++){ dp[i][j][0] = calc(i, j, 0) % MOD; dp[i][j][1] = calc(i, j, 1) % MOD; } } /*for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ cout << dp[i][j][0] << "\t"; } cout << endl; } cout << endl; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ cout << dp[i][j][1] << "\t"; } cout << endl; }*/ cout << (get(n, k, 0) + get(n, k-1, 1)) % MOD << endl; }