1. 程式人生 > >【模版】盧卡斯定理

【模版】盧卡斯定理

https 常用 分享 for 模版 組合 ron 技術分享 scan

給定n,m,p

技術分享(m改為n)

C表示組合數。

一個測試點內包含多組數據。

輸入輸出格式

輸入格式:

第一行一個整數T,表示數據組數

第二行開始共T行,每行三個數n m p,意義如上

輸出格式:

共T行,每行一個整數表示答案。

輸入輸出樣例

輸入樣例#1:
2
1 2 5
2 1 5
輸出樣例#1:
3
3

Lucas定理是用於處理組合數取模的定理

通常用於解決階乘無法解決的問題。

技術分享

技術分享

cm(a,b)=a!*(b!*(a-b)!)^(p-2)mod p

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4
#include<cstring> 5 using namespace std; 6 long long p,a[1000001]; 7 long long qpow(int x,int m) 8 { 9 if (m==0) return 1; 10 long long tmp=qpow(x,m/2); 11 tmp=(tmp*tmp)%p; 12 if (m%2==1) tmp=(tmp*x)%p; 13 return tmp; 14 } 15 long long getc(int n,int m) 16 { 17 if (n<m) return
0; 18 if (m>n-m) m=n-m; 19 return (a[n]*qpow(a[m],p-2))%p*qpow(a[n-m],p-2)%p; 20 } 21 long long lucas(int n,int m) 22 { 23 if (m==0) return 1; 24 return (getc(n%p,m%p)*lucas(n/p,m/p)%p); 25 } 26 int main() 27 {int n,m,T; 28 int l,i; 29 cin>>T; 30 for (l=1;l<=T;l++) 31
{ 32 scanf("%d%d%d",&n,&m,&p); 33 a[0]=1; 34 for (i=1;i<=p;i++) 35 a[i]=(a[i-1]*i)%p; 36 printf("%lld\n",lucas(n+m,n)); 37 } 38 }

【模版】盧卡斯定理