package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 998244353
const G = 3
func pow(a, b int64) int64 {
res := int64(1)
a %= MOD
for b > 0 {
if b%2 == 1 {
res = res * a % MOD
}
a = a * a % MOD
b /= 2
}
return res
}
func ntt(a []int64, invert bool) {
n := len(a)
j := 0
for i := 1; i < n; i++ {
bit := n >> 1
for j&bit != 0 {
j ^= bit
bit >>= 1
}
j ^= bit
if i < j {
a[i], a[j] = a[j], a[i]
}
}
for l := 2; l <= n; l <<= 1 {
half := l >> 1
wLen := pow(G, (MOD-1)/int64(l))
if invert {
wLen = pow(wLen, MOD-2)
}
for i := 0; i < n; i += l {
w := int64(1)
for k := 0; k < half; k++ {
u := a[i+k]
v := a[i+k+half] * w % MOD
a[i+k] = (u + v) % MOD
a[i+k+half] = (u - v + MOD) % MOD
w = w * wLen % MOD
}
}
}
if invert {
nInv := pow(int64(n), MOD-2)
for i := 0; i < n; i++ {
a[i] = a[i] * nInv % MOD
}
}
}
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
var l int64 = 0
for _, b := range scanner.Bytes() {
l = l*10 + int64(b-'0')
}
scanner.Scan()
var t int64 = 0
for _, b := range scanner.Bytes() {
t = t*10 + int64(b-'0')
}
scanner.Scan()
n := 0
for _, b := range scanner.Bytes() {
n = n*10 + int(b-'0')
}
speeds := make([]int, n)
maxV := 0
for i := 0; i < n; i++ {
scanner.Scan()
v := 0
for _, b := range scanner.Bytes() {
v = v*10 + int(b-'0')
}
speeds[i] = v
if v > maxV {
maxV = v
}
}
size := 1
for size <= 2*maxV {
size <<= 1
}
A := make([]int64, size)
B := make([]int64, size)
for _, v := range speeds {
A[v] = 1
B[maxV-v] = 1
}
ntt(A, false)
ntt(B, false)
sumFFT := make([]int64, size)
diffFFT := make([]int64, size)
for i := 0; i < size; i++ {
sumFFT[i] = A[i] * A[i] % MOD
diffFFT[i] = A[i] * B[i] % MOD
}
ntt(sumFFT, true)
ntt(diffFFT, true)
maxS := 2 * maxV
S := make([]bool, maxS+1)
for _, v := range speeds {
sumFFT[2*v] = (sumFFT[2*v] - 1 + MOD) % MOD
}
for i := 1; i <= maxS; i++ {
if sumFFT[i] > 0 {
S[i] = true
}
}
for i := 1; i <= maxV; i++ {
if diffFFT[maxV+i] > 0 {
S[i] = true
}
}
hasMultiple := make([]bool, maxS+1)
for i := 1; i <= maxS; i++ {
if S[i] {
hasMultiple[i] = true
}
}
inSPrime := make([]bool, maxS+1)
for i := 1; i <= maxS; i++ {
for j := i; j <= maxS; j += i {
if hasMultiple[j] {
inSPrime[i] = true
break
}
}
}
minPrime := make([]int, maxS+1)
for i := 2; i <= maxS; i++ {
if minPrime[i] == 0 {
for j := i; j <= maxS; j += i {
if minPrime[j] == 0 {
minPrime[j] = i
}
}
}
}
var ans int64 = 0
for b := 1; b <= maxS; b++ {
if !inSPrime[b] {
continue
}
M := (t * int64(b)) / (2 * l)
if M == 0 {
continue
}
var primes []int64
temp := b
for temp > 1 {
p := minPrime[temp]
primes = append(primes, int64(p))
for temp%p == 0 {
temp /= p
}
}
k := len(primes)
var count int64 = 0
for mask := 0; mask < (1 << k); mask++ {
prod := int64(1)
bits := 0
for i := 0; i < k; i++ {
if (mask & (1 << i)) != 0 {
prod *= primes[i]
bits++
}
}
term := M / prod
if bits%2 == 1 {
count -= term
} else {
count += term
}
}
count %= 1000000007
ans = (ans + count) % 1000000007
}
fmt.Println(ans)
}