hdu5446

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)) ;
          //return (ret%M + M)%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]) ;
              }

             // long  ans = CRT(mod, pri, k) ;

              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());
        }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值