bzoj 2982: combination(lucas定理模板)
阿新 • • 發佈:2018-11-06
lucas定理板子
對於可以轉化為這是一個遞迴的過程,時間為log。
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; int n,m,p=10007; ll inv[100010]; ll jc[100010]; void gett() { inv[1]=1; for(int i = 2;i <= p;i++) { inv[i]=(p-p/i)*inv[p%i]%p; } inv[0]=1; for(int i = 1;i <= p;i++) { inv[i]=inv[i-1]*inv[i]%p; } jc[0]=1; for(int i = 1;i <= p;i++) { jc[i]=jc[i-1]*i%p; } } ll Lucas(ll x,ll y) { if(y==0)return 1; if(x%p<y%p)return 0; return Lucas(x/p,y/p)%p*jc[x%p]*inv[y%p]*inv[(x%p-y%p)%p]%p; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); gett(); printf("%lld\n",Lucas(n,m)%p); } return 0; }