#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MOD 1000000007
#define MAXN 100005
int A[MAXN];
double dp_log[MAXN];
int predecessor[MAXN];
int deque_indices[MAXN];
int front, back;
int main() {
int N, K;
for (int i = 0; i < N; i++) {
}
// Initialize for the first street (0-based index)
predecessor[0] = -1;
front = 0;
back = -1;
deque_indices[++back] = 0;
for (int i = 1; i < N; i++) {
int s = (i - K) > 0 ? (i - K) : 0;
// Remove indices from the front that are out of the window
while (front <= back && deque_indices[front] < s) {
front++;
}
// Get the minimum dp_log in the current window
int min_j = deque_indices[front];
dp_log
[i
] = dp_log
[min_j
] + log(A
[i
]); predecessor[i] = min_j;
// Maintain the deque by removing indices with higher or equal dp_log values
while (front <= back && dp_log[i] <= dp_log[deque_indices[back]]) {
back--;
}
deque_indices[++back] = i;
}
// Calculate the product modulo MOD
long long product = 1;
int current = N - 1;
while (current != -1) {
product = (product * A[current]) % MOD;
current = predecessor[current];
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBNQVhOIDEwMDAwNQoKaW50IEFbTUFYTl07CmRvdWJsZSBkcF9sb2dbTUFYTl07CmludCBwcmVkZWNlc3NvcltNQVhOXTsKaW50IGRlcXVlX2luZGljZXNbTUFYTl07CmludCBmcm9udCwgYmFjazsKCmludCBtYWluKCkgewogICAgaW50IE4sIEs7CiAgICBzY2FuZigiJWQgJWQiLCAmTiwgJkspOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBzY2FuZigiJWQiLCAmQVtpXSk7CiAgICB9CgogICAgLy8gSW5pdGlhbGl6ZSBmb3IgdGhlIGZpcnN0IHN0cmVldCAoMC1iYXNlZCBpbmRleCkKICAgIGRwX2xvZ1swXSA9IGxvZyhBWzBdKTsKICAgIHByZWRlY2Vzc29yWzBdID0gLTE7CgogICAgZnJvbnQgPSAwOwogICAgYmFjayA9IC0xOwogICAgZGVxdWVfaW5kaWNlc1srK2JhY2tdID0gMDsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8IE47IGkrKykgewogICAgICAgIGludCBzID0gKGkgLSBLKSA+IDAgPyAoaSAtIEspIDogMDsKCiAgICAgICAgLy8gUmVtb3ZlIGluZGljZXMgZnJvbSB0aGUgZnJvbnQgdGhhdCBhcmUgb3V0IG9mIHRoZSB3aW5kb3cKICAgICAgICB3aGlsZSAoZnJvbnQgPD0gYmFjayAmJiBkZXF1ZV9pbmRpY2VzW2Zyb250XSA8IHMpIHsKICAgICAgICAgICAgZnJvbnQrKzsKICAgICAgICB9CgogICAgICAgIC8vIEdldCB0aGUgbWluaW11bSBkcF9sb2cgaW4gdGhlIGN1cnJlbnQgd2luZG93CiAgICAgICAgaW50IG1pbl9qID0gZGVxdWVfaW5kaWNlc1tmcm9udF07CiAgICAgICAgZHBfbG9nW2ldID0gZHBfbG9nW21pbl9qXSArIGxvZyhBW2ldKTsKICAgICAgICBwcmVkZWNlc3NvcltpXSA9IG1pbl9qOwoKICAgICAgICAvLyBNYWludGFpbiB0aGUgZGVxdWUgYnkgcmVtb3ZpbmcgaW5kaWNlcyB3aXRoIGhpZ2hlciBvciBlcXVhbCBkcF9sb2cgdmFsdWVzCiAgICAgICAgd2hpbGUgKGZyb250IDw9IGJhY2sgJiYgZHBfbG9nW2ldIDw9IGRwX2xvZ1tkZXF1ZV9pbmRpY2VzW2JhY2tdXSkgewogICAgICAgICAgICBiYWNrLS07CiAgICAgICAgfQogICAgICAgIGRlcXVlX2luZGljZXNbKytiYWNrXSA9IGk7CiAgICB9CgogICAgLy8gQ2FsY3VsYXRlIHRoZSBwcm9kdWN0IG1vZHVsbyBNT0QKICAgIGxvbmcgbG9uZyBwcm9kdWN0ID0gMTsKICAgIGludCBjdXJyZW50ID0gTiAtIDE7CiAgICB3aGlsZSAoY3VycmVudCAhPSAtMSkgewogICAgICAgIHByb2R1Y3QgPSAocHJvZHVjdCAqIEFbY3VycmVudF0pICUgTU9EOwogICAgICAgIGN1cnJlbnQgPSBwcmVkZWNlc3NvcltjdXJyZW50XTsKICAgIH0KCiAgICBwcmludGYoIiVsbGRcbiIsIHByb2R1Y3QpOwoKICAgIHJldHVybiAwOwp9