```go
package main
import (
"fmt"
"io"
"os"
)
const MOD = 998244353
const MAX = 3000005
var phi [MAX]int
var isPrime [MAX]bool
var primes []int
var fact [MAX]int64
var invFact [MAX]int64
func power(base, exp int64) int64 {
res := int64(1)
base %= MOD
for exp > 0 {
if exp&1 == 1 {
res = res * base % MOD
}
base = base * base % MOD
exp >>= 1
}
return res
}
func precompute() {
fact[0] = 1
invFact[0] = 1
for i := 1; i < MAX; i++ {
fact[i] = fact[i-1] * int64(i) % MOD
}
invFact[MAX-1] = power(fact[MAX-1], MOD-2)
for i := MAX - 2; i >= 1; i-- {
invFact[i] = invFact[i+1] * int64(i+1) % MOD
}
for i := 2; i < MAX; i++ {
isPrime[i] = true
}
phi[1] = 1
for i := 2; i < MAX; i++ {
if isPrime[i] {
primes = append(primes, i)
phi[i] = i - 1
}
for _, p := range primes {
if i*p >= MAX {
break
}
isPrime[i*p] = false
if i%p == 0 {
phi[i*p] = phi[i] * p
break
} else {
phi[i*p] = phi[i] * (p - 1)
}
}
}
}
func gcd(a, b int) int {
for b != 0 {
a, b = b, a%b
}
return a
}
func lcm(a, b int) int {
if a == 0 || b == 0 {
return 0
}
return (a / gcd(a, b)) * b
}
func getDivisors(n int) []int {
var res []int
for i := 1; i*i <= n; i++ {
if n%i == 0 {
res = append(res, i)
if i*i != n {
res = append(res, n/i)
}
}
}
return res
}
func main() {
precompute()
in, err := io.ReadAll(os.Stdin)
if err != nil {
return
}
pos := 0
nextInt := func() int {
for pos < len(in) && in[pos] <= 32 {
pos++
}
if pos >= len(in) {
return 0
}
res := 0
for pos < len(in) && in[pos] > 32 {
res = res*10 + int(in[pos]-'0')
pos++
}
return res
}
t := nextInt()
if t == 0 {
return
}
for tc := 0; tc < t; tc++ {
a := nextInt()
b := nextInt()
c := nextInt()
k := nextInt()
d := make([]int, k)
g := 0
for i := 0; i < k; i++ {
d[i] = nextInt()
if i == 0 {
g = d[i]
} else {
g = gcd(g, d[i])
}
}
divA := getDivisors(a)
divB := getDivisors(b)
divC := getDivisors(c)
weights := make(map[int]int64)
for _, A := range divA {
for _, B := range divB {
lcmAB := lcm(A, B)
for _, C := range divC {
m := lcm(lcmAB, C)
if g%m == 0 {
phim := int64(phi[A]) * int64(phi[B]) % MOD
phim = phim * int64(phi[C]) % MOD
weights[m] = (weights[m] + phim) % MOD
}
}
}
}
N := a * b * c
ans := int64(0)
for m, w := range weights {
ways := fact[N/m]
for j := 0; j < k; j++ {
ways = ways * invFact[d[j]/m] % MOD
}
ans = (ans + w*ways) % MOD
}
ans = ans * power(int64(N), MOD-2) % MOD
fmt.Println(ans)
}
}
```