题意:计算C(n,m)%(M1*M2*M3......*Mn) 其中Mi是互不相同的素数
分析:如果是C(n,m)%素数 我们直接使用lucas, 但是现在的模是多个素数相乘,所以我们需要配合中国剩余定理,先使用lucas对每一个Mi进行取模运算,保留结果,最后使用中国剩余定理
代码:
#include #include #include #include #include #include #include #include #include #include #include #include #include #define ll long long //#define mod 1000000007 #define lowbit(x) (x&(-x)) #define mem(a) memset(a,0,sizeof(a)) #define FRER() freopen("in.txt","r",stdin); #define FREW() freopen("out.txt","w",stdout); using namespace std; typedef pair pii; const int maxn = 100000 + 7 , inf = 0x3f3f3f3f ; ll inv[maxn],fac[maxn]; ll p[15],an[15]; ll q_pow(ll a,ll n,ll mod){ ll res = 1; while(n){ if(n&1) res = res * a %mod; a = a * a % mod; n >>= 1; } return res; } void ini(ll x){ fac[0] = 1; for(ll i = 1 ; i < x ; i ++) fac[i] = fac[i-1]*i%x; inv[x-1] = q_pow(fac[x-1],x-2,x); for(ll i = x-2 ; i >= 0;i--) inv[i] = inv[i+1]*(i+1)%x; } ll C(ll a,ll b,ll p){ if(a=mod) res-=mod; } b >>= 1; a <<= 1; if(a >= mod) a -=mod; } return res; } ll CRT(ll n,ll *a,ll *m){ ll M = 1 , res = 0; for(ll i=0;i