1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <bits/stdc++.h>
#define rep(i, s, e) for(int i = s; i <= (e); ++i) #define fep(i, s, e) for(int i = s; i < (e); ++i) #define _rep(i, s, e) for(int i = s; i >= (e); --i) #define _fep(i, s, e) for(int i = s; i > (e); --i)
#define pii pair<int, int>
using namespace std;
constexpr int inf = numeric_limits<int>::max() >> 1; constexpr int ninf = numeric_limits<int>::min() >> 1; constexpr int mod = 1000000007; constexpr double eps = 1e-9;
void M(int &x) { x -= (x >= mod ? mod : 0); }
int fac[3005], inv[3005], pw[3005]; int n, k, ans, cur; string s;
int qpow(int a, int b) { int ans = 1; while(b) { if(b & 1) ans = 1ll * ans * a % mod; a = 1ll * a * a % mod, b >>= 1; } return ans; }
int binom(int a, int b) { if(a < 0 or b < 0 or a < b) return 0; return 1ll * fac[a] * inv[b] % mod * inv[a - b] % mod; }
void solve() { cin >> n >> k >> s, n = 0, ans = 1; while(s.size() and s.back() == '0') { ++n, s.pop_back(); } rep(i, 1, k) { M(cur = binom(n + 2 - i, i + 1) + mod - binom(n - i, i + 1)); M(cur += mod - binom(n + 1 - k, i + 1)); M(cur += binom(n - k, i + 1)); ans = (ans + 1ll * pw[i] * cur) % mod; } cout << ans << '\n'; return; }
signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); n = 3002, fac[0] = 1; rep(i, 1, n) fac[i] = 1ll * fac[i - 1] * i % mod; inv[n] = qpow(fac[n], mod - 2); _rep(i, n - 1, 0) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod; pw[0] = 1; rep(i, 1, n) M(pw[i] = pw[i - 1] << 1); int T = 1; cin >> T; while(T--) solve(); return 0; }
|