hdu5446

来源:互联网 发布:黑马程序员java视频 编辑:程序博客网 时间:2024/06/06 17:54
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
原创粉丝点击