Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <bits/stdc++.h>
- #define boAshraf { ios_base::sync_with_stdio(false); cin.tie(NULL); }
- #define ll long long
- #define sz(s) (int)(s).size()
- #define endl "\n"
- #define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- using namespace std;
- void File();
- void sol();
- const int mod = 1e9 + 7, N = 1e5 + 5;
- int add(ll a, ll b) {
- return (0ll + a%mod + b%mod) % mod;
- }
- int mul(ll a, ll b) {
- return (1LL * a%mod * b%mod) % mod;
- }
- ll a[N];
- int dp1[N][2], dp2[N][3];
- ll k;
- int rec1(int i, int curr) {
- if (i == 0) return curr;
- int &ret = dp1[i][curr];
- if (~ret) return ret;
- ret = 0;
- if (curr) {
- ret = add(ret, mul(k - 2, rec1(i - 1, curr)));
- ret = add(ret, rec1(i - 1, 0));
- } else {
- ret = add(ret, mul(k - 1, rec1(i - 1, 1)));
- }
- return ret;
- }
- int rec2(int i, int curr) {
- if (i == 0) return curr != 1;
- int &ret = dp2[i][curr];
- if (~ret) return ret;
- ret = 0;
- if (curr == 0) {
- ret = add(ret, rec2(i - 1, 1));
- ret = add(ret, mul(k - 2, rec2(i - 1, 2)));
- } else if (curr == 1) {
- ret = add(ret, rec2(i - 1, 0));
- ret = add(ret, mul(k - 2, rec2(i - 1, 2)));
- } else {
- ret = add(ret, rec2(i - 1, 0));
- ret = add(ret, rec2(i - 1, 1));
- ret = add(ret, mul(max(0LL,k - 3), rec2(i - 1, 2)));
- }
- return ret;
- }
- int main() {
- boAshraf
- File();
- int t = 1;
- //cin >> t;
- while (t--) {
- sol();
- }
- return 0;
- }
- void sol() {
- int n;
- ll l, r;
- cin >> n >> l >> r;
- memset(dp1, -1, sizeof dp1);
- memset(dp2, -1, sizeof dp2);
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- }
- if (r - l + 1 <= 1) return void (cout << 0);
- k = (r - l + 1);
- int ans = 1;
- int last = 0;
- for (int i = 1; i < n; ++i) {
- if (a[i] == -1) continue;
- if (a[i] == a[last]) {
- ans = mul(ans, rec1(i-last - 1, 0));
- } else {
- ans = mul(ans, rec2(i-last - 1, 0));
- }
- last = i;
- }
- cout << ans << endl;
- }
- void File() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment