递推求组合数
c[1][1]=c[0][1]=1;
for(int i=2;i<=k;++i)
for(int j=0;j<=min(i,n);++j)
{
if(!j)
c[j][i]=1;
else
c[j][i]=c[j-1][i-1]+c[j][i-1];
}
直接求组合数
mod为质数
ll cmb(ll m,ll n)
{
if(m>n) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
fac[0]=1;
for(ll i=1;i<mod;++i)
fac[i]=fac[i-1]*i%mod;
inv[mod-1]=Pow(fac[mod-1],mod-2);
for(ll i=mod-2;i>=0;--i)
inv[i]=inv[i+1]*(i+1)%mod;
Lucas定理求组合数
,其中p为素数
ll cmb(ll m,ll n)
{
if(m>n) return 0;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
ll lucas(ll m,ll n)
{
if(m==0)
return 1;
return lucas(m/mod,n/mod)*cmb(m%mod,n%mod)%mod;
}
高精度
先分解质因子,再求直接法分子分母阶乘质因子指数之差,高精度乘法求结果.
void mul(Data &a,int b)
{
int t=0;
for(int i=0;i<a.l;++i)
{
a.x[i]=a.x[i]*b+t;
t=a.x[i]/10;
a.x[i]%=10;
}
while(t)
{
a.x[a.l]=t%10;
a.l++;
t/=10;
}
}
int exp(int x,int y)
{
int res=0;
while(x)
{
x/=y;
res+=x;
}
return res;
}
for(int i=0;i<id;++i)
{
t[i]=exp(a,p[i])-exp(b,p[i])-exp(a-b,p[i]);
while(t[i]--)
mul(ans,p[i]);
}