← Home
package main

import (
	"bufio"
	"bytes"
	"io"
	"os"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data}
}

func (fs *FastScanner) NextInt() int {
	n := len(fs.data)
	for fs.idx < n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := 1
	if fs.idx < n && fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	val := 0
	for fs.idx < n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int(c-'0')
		fs.idx++
	}
	return val * sign
}

type Seg struct {
	l, r int
	x, y int
}

func gcd(a, b int) int {
	for b != 0 {
		a, b = b, a%b
	}
	if a < 0 {
		return -a
	}
	return a
}

func main() {
	fs := NewFastScanner()
	t := fs.NextInt()
	var out bytes.Buffer

	for ; t > 0; t-- {
		n := fs.NextInt()
		a := make([]int, n+1)
		b := make([]int, n+1)
		for i := 1; i <= n; i++ {
			a[i] = fs.NextInt()
		}
		for i := 1; i <= n; i++ {
			b[i] = fs.NextInt()
		}

		pa := make([]int, n+1)
		pb := make([]int, n+1)
		for i := 1; i <= n; i++ {
			pa[i] = gcd(pa[i-1], a[i])
			pb[i] = gcd(pb[i-1], b[i])
		}

		sa := make([]int, n+2)
		sb := make([]int, n+2)
		for i := n; i >= 1; i-- {
			sa[i] = gcd(sa[i+1], a[i])
			sb[i] = gcd(sb[i+1], b[i])
		}

		pref := make([]Seg, 0, 128)
		start := 1
		curX, curY := pa[0], pb[0]
		for l := 2; l <= n; l++ {
			x, y := pa[l-1], pb[l-1]
			if x != curX || y != curY {
				pref = append(pref, Seg{start, l - 1, curX, curY})
				start = l
				curX, curY = x, y
			}
		}
		pref = append(pref, Seg{start, n, curX, curY})

		prev := make([]Seg, 0, 128)
		tmp := make([]Seg, 0, 128)
		g1 := make([]int, len(pref))
		g2 := make([]int, len(pref))

		best := int64(-1)
		ways := int64(0)

		for r := 1; r <= n; r++ {
			tmp = tmp[:0]
			ar, br := a[r], b[r]

			for _, s := range prev {
				x := gcd(s.x, ar)
				y := gcd(s.y, br)
				m := len(tmp)
				if m > 0 && tmp[m-1].x == x && tmp[m-1].y == y && tmp[m-1].r+1 == s.l {
					tmp[m-1].r = s.r
				} else {
					tmp = append(tmp, Seg{s.l, s.r, x, y})
				}
			}

			m := len(tmp)
			if m > 0 && tmp[m-1].x == ar && tmp[m-1].y == br && tmp[m-1].r+1 == r {
				tmp[m-1].r = r
			} else {
				tmp = append(tmp, Seg{r, r, ar, br})
			}

			tailA := sa[r+1]
			tailB := sb[r+1]
			for i := 0; i < len(pref); i++ {
				g1[i] = gcd(pref[i].x, tailA)
				g2[i] = gcd(pref[i].y, tailB)
			}

			i, p := 0, 0
			for i < len(tmp) && p < len(pref) {
				c := tmp[i]
				pr := pref[p]

				if pr.r < c.l {
					p++
					continue
				}
				if c.r < pr.l {
					i++
					continue
				}

				l := c.l
				if pr.l > l {
					l = pr.l
				}
				rr := c.r
				if pr.r < rr {
					rr = pr.r
				}

				val := int64(gcd(g1[p], c.y) + gcd(g2[p], c.x))
				cnt := int64(rr - l + 1)

				if val > best {
					best = val
					ways = cnt
				} else if val == best {
					ways += cnt
				}

				if c.r < pr.r {
					i++
				} else if c.r > pr.r {
					p++
				} else {
					i++
					p++
				}
			}

			prev, tmp = tmp, prev
		}

		out.WriteString(strconv.FormatInt(best, 10))
		out.WriteByte(' ')
		out.WriteString(strconv.FormatInt(ways, 10))
		out.WriteByte('\n')
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out.Bytes())
	w.Flush()
}