import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.NavigableSet;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.SortedSet;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) throws IOException{
StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in));
InputReader in = new InputReader(System.in) ;
PrintWriter out = new PrintWriter(System.out) ;
int t = in.nextInt() ;
while(t-- > 0){
new Task().solve(in, out) ;
}
out.flush();
}
}
class Task{
long[] extend_gcd(long a , long b){
if(b == 0){
long x = 1 ;
long y = 0 ;
return new long[]{a , x , y} ;
}
else{
long [] vic = extend_gcd(b , a%b) ;
long y = vic[1] ;
long x = vic[2] ;
y -= x*(a/b) ;
return new long[]{vic[0] , x , y} ;
}
}
BigInteger CRT(long a[] , long m[] , int n){
long M = 1 ;
for(int i = 0 ; i < n ; i++) M *= m[i] ;
long ret = 0 ;
BigInteger sum = BigInteger.ZERO ;
for(int i = 0 ; i < n ; i++){
long tm = M/m[i] ;
long[] vic = extend_gcd(tm , m[i]) ;
long x = vic[1] ;
ret = (ret + tm*x*a[i]) % M ;
sum = sum.add(BigInteger.valueOf(tm).multiply(BigInteger.valueOf(x)).multiply(BigInteger.valueOf(a[i]))) ;
sum = sum.mod(BigInteger.valueOf(M)) ;
}
return sum.add(BigInteger.valueOf(M)).mod(BigInteger.valueOf(M)) ;
}
static long[] fac = new long[100003];
void init(long p){
fac[0] = 1;
for (int i=1; i<=p; i++) fac[i] = fac[i-1]*i%p;
}
long PowerMod(long a, long b, long k){
long tmp = a, ret = 1;
while (b > 0) {
if( (b & 1) > 0) ret = ret * tmp % k;
tmp = tmp * tmp % k;
b >>= 1;
}
return ret;
}
long Lucas(long n, long m, long p){
init(p) ;
long ret = 1;
while (n > 0 && m > 0){
long nn = n%p, mm = m%p;
if (nn < mm) return 0;
ret = ret*fac[(int)nn]*PowerMod(fac[(int)mm]*fac[(int)(nn-mm)]%p, p-2, p)%p;
n /= p;
m /= p;
}
return ret;
}
public void solve(InputReader in , PrintWriter out) throws IOException{
long n = in.nextLong() ;
long m = in.nextLong() ;
int k = in.nextInt() ;
long[] pri = new long[k] ;
long[] mod = new long[k] ;
for(int i = 0 ; i < k ; i++){
pri[i] = in.nextLong() ;
mod[i] = Lucas(n, m, pri[i]) ;
}
out.println(CRT(mod, pri, k));
}
}
class InputReader{
public BufferedReader reader;
public StringTokenizer tokenizer;
public InputReader(InputStream stream){
reader = new BufferedReader(new InputStreamReader(stream), 32768) ;
tokenizer = null ;
}
public String next(){
while(tokenizer == null || ! tokenizer.hasMoreTokens()){
try{
tokenizer = new StringTokenizer(reader.readLine());
}catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
public int nextInt(){
return Integer.parseInt(next());
}
public long nextLong(){
return Long.parseLong(next());
}
public double nextDouble(){
return Double.parseDouble(next());
}
}