```go
package main
import (
"bufio"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, 1024*1024*10), 1024*1024*10)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
sBytes := scanner.Bytes()
n := int32(len(sBytes))
S := make([]byte, n)
copy(S, sBytes)
if !scanner.Scan() {
return
}
m, _ := strconv.Atoi(scanner.Text())
f := make([]int32, n+1)
path := make([]int32, n+1)
pos_in_path := make([]int32, n+1)
cycle_idx := make([]int32, n+1)
pos_in_cycle := make([]int32, n+1)
visited := make([]bool, n+1)
cycle_nodes := make([]int32, n+1)
cycle_offset := make([]int32, n+1)
cycle_length := make([]int32, n+1)
P := make([]int32, n)
newS := make([]byte, n)
writer := bufio.NewWriterSize(os.Stdout, 1024*1024)
defer writer.Flush()
for q := 0; q < m; q++ {
if !scanner.Scan() {
break
}
k_int, _ := strconv.Atoi(scanner.Text())
if !scanner.Scan() {
break
}
d_int, _ := strconv.Atoi(scanner.Text())
k := int32(k_int)
d := int32(d_int)
if d == 1 || d >= k {
writer.Write(S)
writer.WriteByte('\n')
continue
}
new_idx := int32(0)
for r := int32(0); r < d; r++ {
for x := r; x < k; x += d {
f[x] = new_idx
new_idx++
}
}
path_len := int32(0)
curr := k - 1
for curr != 0 {
path[path_len] = curr
path_len++
curr = f[curr] - 1
}
path[path_len] = 0
path_len++
for i := int32(0); i < k; i++ {
pos_in_path[i] = -1
visited[i] = false
}
for i := int32(0); i < path_len; i++ {
node := path[i]
pos_in_path[node] = i
visited[node] = true
}
cycle_ptr := int32(0)
num_cycles := int32(0)
for i := int32(1); i < k; i++ {
if !visited[i] {
start_ptr := cycle_ptr
c := i
for !visited[c] {
visited[c] = true
cycle_idx[c] = num_cycles
pos_in_cycle[c] = cycle_ptr - start_ptr
cycle_nodes[cycle_ptr] = c
cycle_ptr++
c = f[c] - 1
}
cycle_offset[num_cycles] = start_ptr
cycle_length[num_cycles] = cycle_ptr - start_ptr
num_cycles++
}
}
for j := int32(0); j < n; j++ {
var t_in, x_in, T int32
if j < k {
t_in = 0
x_in = j
T = n - k + 1
} else {
t_in = j - k + 1
x_in = k - 1
T = n - j
}
if pos_in_path[x_in] != -1 {
d_x := path_len - 1 - pos_in_path[x_in]
if d_x <= T-1 {
P[j] = t_in + d_x
} else {
p := path[pos_in_path[x_in]+T]
P[j] = n - k + 1 + p
}
} else {
c_id := cycle_idx[x_in]
p_c := pos_in_cycle[x_in]
length := cycle_length[c_id]
new_p := (p_c + T) % length
p := cycle_nodes[cycle_offset[c_id]+new_p]
P[j] = n - k + 1 + p
}
}
for j := int32(0); j < n; j++ {
newS[P[j]] = S[j]
}
for j := int32(0); j < n; j++ {
S[j] = newS[j]
}
writer.Write(S)
writer.WriteByte('\n')
}
}
```