【模版】盧卡斯定理
阿新 • • 發佈:2017-07-02
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) return0; 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 }
【模版】盧卡斯定理