#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <unordered_map>
#include <stack>
#include <queue>
#define nxt (a[i][j-1]+i)%n?(a[i][j-1]+i)%n:n
using namespace std;
typedef long long int64;
const int MAXN = 2 * 1e5 + 7;
const int INF = (1 << 30) - 1 + (1 << 30);
const int64 INF64 = (1ll << 62ll) - 1ll + (1ll << 62ll);
const int64 mod = 1e9 + 7;
int n, Q;
int pre[MAXN];
int64 m;
int64 a[MAXN][64];
char s[MAXN];
template<typename T_int>
void input(T_int &x) {
char ch = getchar();
T_int fu = 1; x = 0;
while(!('0' <= ch && ch <= '9')) fu = ((ch == '-') ? -1 : fu), ch = getchar();
while('0' <= ch && ch <= '9') x = x * 10 + (ch - '0'), ch = getchar();
x *= fu;
}
int main() {
input(n), input(m), input(Q);
scanf("%s", s+1);
for(int i=1; i<=n; i++) pre[i] = (s[i] == '1' ? i : pre[i-1]);
for(int i=1; i<=n; i++) {
if(m + i <= 1ll * n) a[i][0] = (pre[i+m] == pre[i] ? 1 : pre[i+m] - i);
else if(m + i <= 2ll * n) {
int tmp = m + i - n;
if(pre[tmp]) a[i][0] = pre[tmp] + n - i;
else a[i][0] = (pre[n] == pre[i] ? 1 : pre[n] - i);
}
else {
int tmp = (m + i) % n;
if(pre[tmp]) a[i][0] = (m - tmp + pre[tmp]) % mod;
else a[i][0] = (!pre[n] ? 1 : m-(tmp+n-pre[n])) % mod;
}
}
for(int j=1; j<=61; j++) {
for(int i=1; i<=n; i++) a[i][j] = (a[i][j-1] + a[nxt][j-1]) % mod;
}
while(Q--) {
int64 IDX, k;
input(IDX), input(k);
int idx = IDX % n;
idx = !idx ? n : idx;
int64 cnt = 0ll, dis = 0ll;
for(int64 j=61; j>=0; j--) {
if(cnt + (1ll << j) > k) continue;
cnt += (1ll << j);
dis = (dis + a[idx][j]) % mod;
idx = (idx + a[idx][j]) % n ? (idx + a[idx][j]) % n : n;
}
printf("%lld\n", (IDX % mod + dis) % mod);
}
return 0;
}