using namespace std;
const int MAXN = 200005;
bool ispri[MAXN];
int prime[MAXN];
int priCnt;
void CalPrime()
{
priCnt = 0;
memset(ispri,false,sizeof(ispri));
for(int i = 2;i < MAXN; ++i)
{
if(ispri[i] == false)
{
prime[priCnt++] = i;
for(int j = i+i;j < MAXN; j += i)
ispri[j] = true;
}
}
}
LL DivideByPrime(LL N,LL P)
{
LL ans = 0;
while(N)
ans += N/P,N /= P;
return ans;
}
LL QuickMod(LL a,LL b,LL m)
{
LL ans = 1;
a %= m;
while(b)
{
if(b&1)
ans = ans*a%m,b--;
b >>= 1;
a = a*a%m;
}
return ans;
}
//C(N,M) % P
LL CalCnmModP(LL N,LL M,LL P)
{
LL ans = 1;
for(int i = 0 ;i < priCnt && prime[i] <= N; ++i)
{
LL x = DivideByPrime(N,prime[i]);
LL y = DivideByPrime(N-M,prime[i]);
LL z = DivideByPrime(M,prime[i]);
x -= (y+z);
ans *= QuickMod(prime[i],x,P);
ans %= P;
}
return ans;
}
组合数取余(Mod 可以不为质数)
最新推荐文章于 2021-11-29 23:51:30 发布