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

传送门

题意:求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


你可能感兴趣的:(组合数学,数论,数学)