← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MAX = 1000000

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	k, n := readInt(scanner), readInt(scanner)
	
	p := make([]int, k)
	isPeriod := make([]bool, MAX+1)
	for i := 0; i < k; i++ {
		p[i] = readInt(scanner)
		isPeriod[p[i]] = true
	}
	
	x := make([]int, n)
	for i := 0; i < n; i++ {
		x[i] = readInt(scanner)
	}

	anyPeriod := p[0]

	periodForGcd := make([]int, MAX+1)
	for val := 1; val <= MAX; val++ {
		if isPeriod[val] {
			for multiple := val; multiple <= MAX; multiple += val {
				if periodForGcd[multiple] == 0 {
					periodForGcd[multiple] = val
				}
			}
		}
	}

	checkSet := func(l, r int) (bool, int, int) {
		if l > r {
			return true, 1, anyPeriod
		}
		if l == r {
			return true, x[l], anyPeriod
		}
		g := 0
		for i := l + 1; i <= r; i++ {
			diff := x[i] - x[l]
			if diff < 0 {
				diff = -diff
			}
			g = gcd(g, diff)
		}
		if g == 0 {
			return true, x[l], anyPeriod
		}
		if g <= MAX && periodForGcd[g] != 0 {
			return true, x[l], periodForGcd[g]
		}
		return false, 0, 0
	}

	if ok, s, cp := checkSet(0, n-1); ok {
		printYES(s, cp, x[0], anyPeriod)
		return
	}

	attempt := func() (bool, int, int, int, int) {
		if ok, s, cp := checkSet(1, n-1); ok {
			return true, x[0], anyPeriod, s, cp
		}

		candidates := make(map[int]struct{})
		addDivisors(x[1]-x[0], candidates)
		if n > 2 {
			addDivisors(x[2]-x[0], candidates)
			addDivisors(x[2]-x[1], candidates)
		}

		for pVal := range candidates {
			if !isPeriod[pVal] {
				continue
			}
			firstIdx := -1
			g := 0
			for i := 0; i < n; i++ {
				if (x[i]-x[0])%pVal != 0 {
					if firstIdx == -1 {
						firstIdx = i
					} else {
						diff := x[i] - x[firstIdx]
						if diff < 0 {
							diff = -diff
						}
						g = gcd(g, diff)
					}
				}
			}

			if firstIdx == -1 {
				continue
			}

			if g == 0 {
				return true, x[0], pVal, x[firstIdx], anyPeriod
			}

			if g <= MAX && periodForGcd[g] != 0 {
				return true, x[0], pVal, x[firstIdx], periodForGcd[g]
			}
		}
		return false, 0, 0, 0, 0
	}

	if ok, s1, cp1, s2, cp2 := attempt(); ok {
		printYES(s1, cp1, s2, cp2)
		return
	}

	for i := 0; i < n/2; i++ {
		x[i], x[n-1-i] = x[n-1-i], x[i]
	}

	if ok, s1, cp1, s2, cp2 := attempt(); ok {
		printYES(s1, cp1, s2, cp2)
		return
	}

	fmt.Println("NO")
}

func readInt(scanner *bufio.Scanner) int {
	scanner.Scan()
	val := 0
	for _, b := range scanner.Bytes() {
		val = val*10 + int(b-'0')
	}
	return val
}

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

func addDivisors(val int, set map[int]struct{}) {
	if val < 0 {
		val = -val
	}
	for i := 1; i*i <= val; i++ {
		if val%i == 0 {
			set[i] = struct{}{}
			set[val/i] = struct{}{}
		}
	}
}

func printYES(s1, cp1, s2, cp2 int) {
	fmt.Println("YES")
	fmt.Println(s1, cp1)
	fmt.Println(s2, cp2)
}
```