1 //数据量较小 2 void C() 3 { 4 c[0][0]=1; 5 for(int i=1;i<=10;i++) 6 { 7 for(int j=0;j<=i;j++){ 8 if(j==0||j==i) c[i][j]=1; 9 else{ 10 c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; 11 } 12 printf("%d%c",c[i][j],j==i?'\n':' '); 13 } 14 printf("\n"); 15 } 16 } 17 18 19 20 // 0≤n≤1e18,0≤m≤1e6,1≤mod≤1e9,用卢卡斯定理 21 void egcd(ll a,ll b,ll &x,ll &y) 22 { 23 ll d; 24 if(!b) { 25 x=1,y=0; 26 return ; 27 } 28 else{ 29 egcd(b,a%b,y,x); 30 y-=(a/b)*x; 31 } 32 } 33 ll inv(ll n) 34 { 35 ll x,y; 36 egcd(n,mod,x,y); 37 return (x%mod+mod)%mod; 38 } 39 ll C(ll n,ll m) 40 { 41 if(m>n) return 0; 42 ll ans=1ll; 43 for(ll i=1;i<=m;i++) 44 { 45 ans=(ans*(n-m+i)%mod*inv(i)%mod)%mod; 46 } 47 return ans; 48 } 49 ll solve(ll n,ll m) 50 { 51 if(m==0) return 1; 52 return C(n%mod,m%mod)*solve(n/mod,m/mod)%mod; 53 } 54 55 56 //0≤m≤n≤1e18,1≤mod≤1e6,用卢卡斯定理 57 ll f[1000009]; 58 void init() 59 { 60 f[0]=1; 61 for(ll i=1;i<=mod;i++) 62 { 63 f[i]=(f[i-1]*i)%mod; 64 } 65 return ; 66 } 67 void egcd(ll a,ll b,ll &x,ll &y) 68 { 69 ll d; 70 if(!b){ 71 x=1,y=0; 72 return ; 73 } 74 else{ 75 egcd(b,a%b,y,x); 76 y-=(a/b)*x; 77 } 78 } 79 ll inv(ll n) 80 { 81 ll x,y; 82 egcd(n,mod,x,y); 83 return (x%mod+mod)%mod; 84 } 85 ll C(ll n,ll m) 86 { 87 ll ans=1ll; 88 while(n&&m){ 89 ll nn=n%mod,mm=m%mod; 90 if(nn<mm) return 0; 91 ans=(ans*f[nn]%mod*inv(f[mm]*f[nn-mm]%mod)%mod)%mod; 92 n/=mod; 93 m/=mod; 94 } 95 return ans; 96 }
组合数的几种写法
猜你喜欢
转载自www.cnblogs.com/tingtin/p/9386750.html
今日推荐
周排行