Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <map>
- #include <string>
- #include <cmath>
- #include <set>
- #include <random>
- #define int long long
- #define debug(a) cout << #a << " = " << a << "\n"
- using namespace std;
- const int mod = 1e9 + 7;
- void add(int &a, int b)
- {
- a += b;
- a %= mod;
- }
- int mul(int a, int b)
- {
- return (a * b) % mod;
- }
- const int MAXN = 2e5 + 15;
- int dp[MAXN];
- int link[MAXN];
- // DO
- int t[4 * MAXN];
- int psh[4 * MAXN];
- void push(int i, int tl, int tr)
- {
- add(t[i], mul(tr - tl, psh[i]));
- if (tl + 1 != tr)
- {
- add(psh[i * 2], psh[i]);
- add(psh[i * 2 + 1], psh[i]);
- }
- psh[i] = 0;
- }
- void modify(int i, int tl, int tr, int l, int r, int key)
- {
- push(i, tl, tr);
- if (l <= tl && tr <= r)
- {
- add(psh[i], key);
- push(i, tl, tr);
- return;
- }
- if (tl >= r || l >= tr)
- {
- return;
- }
- int mid = (tl + tr) / 2;
- modify(i * 2, tl, mid, l, r, key);
- modify(i * 2 + 1, mid, tr, l, r, key);
- t[i] = 0;
- add(t[i], t[i * 2]);
- add(t[i], t[i * 2 + 1]);
- }
- int get(int i, int tl, int tr, int pos)
- {
- push(i, tl, tr);
- if (tl + 1 == tr)
- {
- return t[i];
- }
- int mid = (tl + tr) / 2;
- if (pos < mid)
- return get(i * 2, tl, mid, pos);
- else
- return get(i * 2 + 1, mid, tr, pos);
- }
- //
- string a[MAXN];
- void solve()
- {
- int n, k;
- cin >> n >> k;
- for (int i = 1; i <= n; ++i)
- {
- cin >> a[i];
- }
- dp[0] = 1;
- int s = 0;
- for (int i = n; i >= 1; --i)
- {
- link[i] = s;
- if (a[i].size() != 3) s = 0;
- else ++s;
- }
- int cur = 0;
- for (int i = 1; i <= n; ++i)
- {
- int sz = a[i].size();
- if (a[i] == "0")
- {
- modify(1, 0, MAXN, i, i + 1, dp[i - 1]);
- }
- else
- {
- if (sz < 3 || (sz == 3 && a[i][0] != '0'))
- {
- int r = (k - sz) / 3;
- int nex = i + min(r, link[i]);
- modify(1, 0, MAXN, i, nex + 1, dp[i - 1]);
- }
- }
- dp[i] = get(1, 0, MAXN, i);
- }
- cout << dp[n] << "\n";
- }
- signed main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- #endif
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement