首页 > 代码库 > 求组合数

求组合数

第一类时mod为素数

 1 typedef long long LL; 2  3 LL n,m,p; 4  5 LL quick_mod(LL a, LL b) 6 { 7     LL ans = 1; 8     a %= p; 9     while(b)10     {11         if(b & 1)12         {13             ans = ans * a % p;14             b--;15         }16         b >>= 1;17         a = a * a % p;18     }19     return ans;20 }21 22 LL C(LL n, LL m)23 {24     if(m > n) return 0;25     LL ans = 1;26     for(int i=1; i<=m; i++)27     {28         LL a = (n + i - m) % p;29         LL b = i % p;30         ans = ans * (a * quick_mod(b, p-2) % p) % p;31     }32     return ans;33 }34 35 LL Lucas(LL n, LL m)36 {37     if(m == 0) return 1;38     return C(n % p, m % p) * Lucas(n / p, m / p) % p;39 }
p == prime
第二类时mod可以为合数
 1 typedef long long LL; 2 const int N = 200005; 3  4 bool prime[N]; 5 int p[N]; 6 int cnt; 7  8 void isprime() 9 {10     cnt = 0;11     memset(prime,true,sizeof(prime));12     for(int i=2; i<N; i++)13     {14         if(prime[i])15         {16             p[cnt++] = i;17             for(int j=i+i; j<N; j+=i)18                 prime[j] = false;19         }20     }21 }22 23 LL quick_mod(LL a,LL b,LL m)24 {25     LL ans = 1;26     a %= m;27     while(b)28     {29         if(b & 1)30         {31             ans = ans * a % m;32             b--;33         }34         b >>= 1;35         a = a * a % m;36     }37     return ans;38 }39 40 LL Work(LL n,LL p)41 {42     LL ans = 0;43     while(n)44     {45         ans += n / p;46         n /= p;47     }48     return ans;49 }50 51 LL Solve(LL n,LL m,LL P)52 {53     LL ans = 1;54     for(int i=0; i<cnt && p[i]<=n; i++)55     {56         LL x = Work(n, p[i]);57         LL y = Work(n - m, p[i]);58         LL z = Work(m, p[i]);59         x -= (y + z);60         ans *= quick_mod(p[i],x,P);61         ans %= P;62     }63     return ans;64 }65 66 int main()67 {68     int T;69     isprime();70     cin>>T;71     while(T--)72     {73         LL n,m,P;74         cin>>n>>m>>P;75         n += m - 2;76         m--;77         cout<<Solve(n,m,P)<<endl;78     }79     return 0;80 }
View Code

 

求组合数