//组合数打表:
const int maxk = 2000 + 5;
LL C[maxk][maxk];
void table_C(){
memset(C, 0,sizeof(C));
C[0][0] = 1;
for(int i = 0; i <= maxk-5; i++){
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; j++)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % MOD;
}
}
//C(m,n) 组合数
LL C(int m,int n)
{
LL ans = 1;
int t = m;
while(t) {
ans *= n;
n--;
t--;
if(ans%m == 0 && m != 0) {
ans /= m;
m--;
}
}
while(m) {
ans /= m;
m--;
}
return ans;
}
//--------------------------------------------------------------------------------
ll x,y,d;
#define mod 100000007
ll quickmod(ll a,int n) //快速模幂
{
ll ans=1;
for(; n; n>>=1,a=a*a%mod)
if(n&1) ans=ans*a%mod;
return ans;
}
void exgcd(ll a,ll b) // 扩展欧几里得
{
if(b==0)
{
x=1;
y=0;
d=a;
}
else
{
exgcd(b,a%b);
ll t=x%mod;
x=y%mod;
y=(t-a/b*x)%mod;
}
}
ll C(ll a,ll b)
{
if(a<b||a<0||b<0) return 0;
ll ret=1,ret1=1;
for(int i=0; i<b; i++) ret=ret*(a-i)%mod,ret1=ret1*(i+1)%mod;
//ret=ret*quickmod(ret1,mod-2)%mod; //费马定理求逆元,貌似这快点
exgcd(ret1,mod); //欧几里得求逆元
ret=(ret*(x+mod)%mod)%mod;
return ret;
}
组合数,快速幂,扩展欧几里得及其求逆元模板
最新推荐文章于 2020-04-08 10:45:01 发布