逆元的主要用处,当求a/b模p时,a与b过大,就可以用逆元,求出b的逆元,一般是pow(b,p-2),a/b及等于a*b逆。
组合数使用了这一个特性,求出阶乘的逆
1 int fac[N]//表示阶乘; 2 int infac[N]//表示阶乘的逆; 3 int main(){ 4 int a,b; 5 fac[0]=infac[0]=1; 6 for(int i=1;i<N;++i){ 7 fac[i]=1ll*fac[i-1]*i%mod; 8 infac[i]=1ll*infac[i-1]*qmi(i,mod-2,mod)%mod; 9 } 10 cin>>a>>b; 11 cout<<1ll*fac[a]*infac[a-b]%mod*infac[b]%mod<<endl; 12 return 0; 13 }
两大数相乘在取模和容易爆
1 ll um(ll x,ll y,ll mod){ 2 x%=mod; 3 y%=mod; 4 ll d=((long double)x*y/mod); 5 d=x*y-d*mod; 6 if(d>=mod){ 7 d%=mod; 8 } 9 if(d<0){ 10 d+=mod; 11 } 12 return d; 13 }
快速乘与快速幂类似,原理是转化成相加
int qmi(int x,int y,int mod){ int res=0; while(y){ if(y&1){ res=(res+x)%mod; } x=(x+x)%mod; y>>=1; } return res; }
标签:组合,int,res,ll,逆元,计算,阶乘,优化,mod From: https://www.cnblogs.com/xuanru/p/16754795.html