nefu628 组合数取模,模不是素数的情况

2019-04-13 13:33发布

传送门 题意:求C(m+n-2,m-1)%p,其中1<=m,n,p<=1e5,p不一定是素数 思路:数据范围并不是很大,但关键是p不一定是素数,所以传统求逆元的方法如费马小定理或者扩展欧几里得都不适用了,C(m+n-2,m-1)=(m+n-2)!/((n-1)!*(m-1)!),可以把这个数暴力分解素因子,计算其中包含的素因子个数,然后再用快速幂计算,累乘就得到了最后的结果。十分暴力。 #include #include #include #include #include #include using namespace std; typedef long long ll; const int maxn=1e6+5; bool prime[maxn]; int p[maxn]; int cnt; int mod; void isprime() { cnt=0; memset(prime,true,sizeof(prime)); for(int i=2;i>=1; a=a*a%m; } return ans; } ll fun(ll n,ll m)///计算n!中m这个素因子的个数 { ll ans=0; while(n) { ans+=n/m; n=n/m; } return ans; } ll solve(ll n,ll m,ll pp) { n=n+m-2; m=m-1; ll ans=1; for(int i=0;i