【luogu3807】【bzoj2982】【模板】卢卡斯定理 combination
这两个题都是lucas的模板题 我只是因为combination的题面很有趣 所以决心一定要打出来
证明什么的emmmmm 后面再说
背模板!!!!
LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样。那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案mod 10007的值。(1<=m<=n<=200,000,000)
放combination的代码 这个体面hei因垂死听
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 #include<cmath> 6 #include<stack> 7 #include<algorithm> 8 using namespace std; 9 #define ll long long 10 #define rg register 11 ll p=10007; 12 template <class t>void rd(t &x) 13 { 14 x=0;int w=0;char ch=0; 15 while(!isdigit(ch)) w|=ch=='-',ch=getchar(); 16 while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); 17 x=w?-x:x; 18 } 19 20 ll fpow(ll a,ll b) 21 { 22 ll res=1; 23 while(b) 24 { 25 if(b&1) res=res*a%p; 26 a=a*a%p,b>>=1; 27 } 28 return res; 29 } 30 31 ll C(ll n,ll m) 32 { 33 if(m>n) return 0; 34 ll a=1,b=1; 35 for(rg ll i=n-m+1;i<=n;++i) a=a*i%p; 36 for(rg ll i=2;i<=m;++i) b=b*i%p; 37 return (a*fpow(b,p-2))%p; 38 } 39 40 ll lucas(ll n,ll m) 41 { 42 if(!m) return 1; 43 else return (C(n%p,m%p)*lucas(n/p,m/p))%p; 44 } 45 46 int main() 47 { 48 freopen("in.txt","r",stdin); 49 //freopen("nocows.out","w",stdout); 50 ll T;rd(T); 51 while(T--) 52 { 53 ll n,m; 54 rd(n),rd(m); 55 printf("%lld\n",lucas(n,m)); 56 } 57 return 0; 58 }