组合数的几种写法

 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