HDU5446 Unknown Treasure[中国剩余定理+Lucas]
2017-05-18 15:02
369 查看
Unknown Treasure
HDU - 5446题意:
T组数据, 给你n,m,k ,接下来给你k个素数 求C(n,m)%(这k个素数的积)
题解:
题目给我的M 是由(p1*p2*...*pk)组成的,给我的第一反应是中国剩余定理.
那么照着这个方向,我们就必须得得到同余式.
我们的同余式则是有 x%pi=ai 那么我们的x就是我们需要求的组合数.
用Lucas 求出C(n,m)%pi的值,再用中国剩余定理求出x%M的值
(好久没认真写题了,日常划水,现在好不容易写一题博客)
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<queue> #include<stack> #include<set> #include<map> #include<vector> using namespace std; typedef long long ll; const int N=15; const int maxn=1e5+5; ll n,m; int k; int prim ; ll a ; ll fac[maxn]; void initial(int mod) { fac[0]=1; for (int i=1 ; i<mod+1 ; ++i) fac[i]=fac[i-1]*i%mod; } ll Pow(ll n,ll m,ll mod) { n%=mod; ll res=1; while (m) { if (m&1) res=res*n%mod; n=n*n%mod; m>>=1; } return res; } ll C(ll n,ll m,ll p) { if (n<m) return 0; return fac *Pow(fac[m]*fac[n-m],p-2,p)%p; } ll lucas(ll n,ll m,ll p) { if (!n || !m) return 1; return lucas(n/p,m/p,p)*C(n%p,m%p,p)%p; } ll exgcd(ll a,ll b,ll &x,ll &y) { if (!b) { x=1; y=0; return a; } ll gcd=exgcd(b,a%b,x,y); ll tmp=x; x=y; y=tmp-a/b*x; return gcd; } ll add(ll a,ll b,ll m) { ll ans=0; while (b) { if (b&1) ans=(ans+a)%m; a=(a+a)%m; b>>=1; } return ans; } ll crt(ll a[],int m[],int n) { ll M=1; ll ans=0; for (int i=0 ; i<n ; ++i) M*=m[i]; for (int i=0 ; i<n ; ++i) { ll x,y; ll Mi=M/m[i]; exgcd(Mi,m[i],x,y); ans=(ans+add(add(x,Mi,M),a[i],M)+M)%M; } if (ans<0) ans+=M; return ans; } int main() { int T; scanf("%d",&T); while (T--) { scanf("%lld%lld%d",&n,&m,&k); for (int i=0 ; i<k ; ++i) { scanf("%d",&prim[i]); initial(prim[i]); a[i]=lucas(n,m,prim[i]); } printf("%lld\n",crt(a,prim,k)); } return 0; }
相关文章推荐
- hdu5446(组合数取模 Lucas定理 中国剩余定理)
- HDU5446 Unknown Treasure(组合数膜合数-->Lucas+中国剩余定理)
- Lucas定理+中国剩余定理 hdu5446 Unknown Treasure
- hdu5446 lucas+中国剩余定理
- hdu5446 Unknown Treasure(Lucas+中国剩余定理)
- HDU 5446 Unknown Treasure Lucas+中国剩余定理+按位乘
- Hdu 5446 Unknown Treasure (2015 ACM/ICPC Asia Regional Changchun Online Lucas定理 + 中国剩余定理)
- bzoj 1951(Lucas定理+中国剩余定理)
- 【bzoj3782】上学路线 组合数学+Lucas定理+中国剩余定理
- [BZOJ2142] 礼物 - Lucas定理及扩展 - 中国剩余定理 - 扩展欧几里得算法
- HDU 4373 Mysterious For(Lucas定理、中国剩余定理)
- HDU 5446 (中国剩余定理 Lucas)
- [BZOJ 1951] 古代猪文【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】
- HDU 4373 Mysterious For(Lucas 定理 + 中国剩余定理)
- HDU 5446 Unknown Treasure (Lucas + 中国剩余定理)
- [BZOJ1951][SDOI2010]古代猪文(Lucas定理+中国剩余定理)
- hdu 5446 Lucas定理,中国剩余定理,处理爆long long 的乘法取模运算
- Unknown Treasure ————(hdu5446) 中国剩余定理+卢卡斯定理
- hdu4373 lucas定理+中国剩余定理
- HDU 5446 中国剩余定理+lucas