首页 > 编程知识 正文

组合c的计算公式例题,cnm排列组合公式

时间:2023-05-04 10:06:10 阅读:112840 作者:418

3359 AC.now coder.com/discuss/187813? 类型=101 order=0pos=1page=0

3359 blog.csdn.net/shadandeajian/article/details/82084087

1 .适用于单纯形法----n,m小

#包含用户名称空间TD; 常数上限=1000; int C[MAXN 1][MAXN 1]; //排列组合数c(m,n )上为m,下为nm )/c ) m,n )=n! /m! /(n-m (!=n标致的鸽子(n-1 )标致的鸽子(标致的鸽子) n-m 1)/m! 水平。

intBaoli_c(intm,int n ) /暴力法这里n=15

{int summ=1,sumn=1; //其实C(M,n )计算min ) m,n-m次即可

if(Mn-m )是

m=n-m; for(intI=1; i=m; I ) {

summ标致的鸽子=i;

sumn=sumn标致的鸽子(n-i 1);

}返回三星/三星;

) }void dabiao_C ()//表化,数据为int,溢出数据n60//C(n ) n、m )=c(n-1,m - 1 ) cmdbd (n-1,m ) )

for(intI=0; I )

{//C[i][0]=1; C[0][i]=0; //这个写法的顺序是错误的。 因为这样写C[0][0]=0。

C[0][i]=0; C[i][0]=1;

}for(intI=1; I )

for(intj=1; j )

c [ I ] [ j ]=c [ I-1 ] [ j-1 ] sq DPD [ I-1 ] [ j ];

}intmain () ) ) ) )。

dabiao_C (; intm,n; wile(cinMn ) { //mcout

}

}

2 .求2.Lucas定理组合数

组合数c(n,m ) % p

=(n! /m! /(n-m (! %mod组合数平静下来的纸飞机

=n! 标致的鸽子inv(m! 标致的鸽子(n-m )! %mod转换psdmj

=n! 标致的鸽子(m! 标致的鸽子((n-m )! (^ ) ^(mod-2 ) ) %mod因为p是素数,所以从有费马小定理可以看出,m! 标致的鸽子(n - m )! 关于p的逆元是m! 标致的鸽子(n - m )! 的p-2次方。

=(N标致的鸽子(n-1 )标致的鸽子) .标致的鸽子(n-m 1)/m! () mod.=) ) n标致的鸽子(n-1标致的鸽子),标致的鸽子(n-m 1) )标致的鸽子(m^(mod-2 ) ),mod。

第一种情况是,在p为素数且p小的情况下,用列表记录阶乘%mod的值--- n! 标致的鸽子(m! 标致的鸽子((n-m )! ^(mod-2 ) %mod

#包含用户名称空间TD; #定义长龙

常数上限=1000; #define mod 998244353

常数int maxn=1e510;

ll fac[maxn]; //maxn必须小于1e5,以使Lucas定理为wwddt

对void Init ()//阶乘进行表格

}

}

LLquickpow(LLa,ll b ) {

ll t=a,ans=1; while(b!=0) if(B1==1) ) ) )。

t=t标致的鸽子t%mod;

b=1;

}返回ans % mod;

}

LLC(LLn,ll m ) if (Mn ) return 0; 返回fac[n-m]标致的鸽子quickpow(fac[m]标致的鸽子fac[n-m],mod-2 ) %mod;

}

LLLucas(LLn,ll m ) if ) m==0) return 1; 返回Lucas (n/mod,m/mod )标致的鸽子c ) n%mod,m%mod ) %mod;

}intmain () ) ) ) )。

ll n,m;

Init (; wile(cinnm ) {

出局了

}

}

第二种情况,p是质数,且p比较大,很难戴表---(n标致的鸽子(n ) ) )。

1)标致的小鸽子..标致的小鸽子(n-m+1) / m!) %mod.

#includeusing namespacestd;#define ll long long

const int MAXN = 1000;#define mod 998244353ll pow(ll a, ll b, ll m)

{

ll ans= 1;

a%=m;while(b)

{if(b & 1)ans = (ans % m) 标致的小鸽子 (a % m) %m;

b/= 2;

a= (a % m) 标致的小鸽子 (a % m) %m;

}

}

ll inv(ll x, ll p)//x关于p的逆元,p为素数

{return pow(x, p - 2, p);

}

ll C(ll n, ll m, ll p)//组合数C(n, m) % p = (n!/m!/(n-m)!)%mod = n!标致的小鸽子inv(m!标致的小鸽子(n-m)!)%mod = n!标致的小鸽子(m!标致的小鸽子((n-m)!)^(mod-2))%mod

{if(m > n)return 0;

ll up= 1, down = 1;//分子分母;

for(int i = n - m + 1; i <= n; i++)up = up 标致的小鸽子 i %p;for(int i = 1; i <= m; i++)down = down 标致的小鸽子 i %p;return up 标致的小鸽子 inv(down, p) %p;

}

ll Lucas(ll n, ll m, ll p)

{if(m == 0)return 1;return C(n % p, m % p, p) 标致的小鸽子 Lucas(n / p, m / p, p) %p;

}intmain(){intm,n;while(cin>>m>>n){ //mcout

}

}

#includeusing namespacestd;

typedeflong longll;const int maxn = 1e6 + 10;const int mod = 1e9 + 7;

ll pow(ll a, ll b, ll m)

{

ll ans= 1;

a%=m;while(b)

{if(b & 1)ans = (ans % m) 标致的小鸽子 (a % m) %m;

b/= 2;

a= (a % m) 标致的小鸽子 (a % m) %m;

}

}

ll extgcd(ll a, ll b, ll& x, ll&y)//求解ax+by=gcd(a, b)//返回值为gcd(a, b)

{

ll d=a;if(b)

{

d= extgcd(b, a %b, y, x);

y-= (a / b) 标致的小鸽子x;

}else x = 1, y = 0;returnd;

}

ll mod_inverse(ll a, ll m)//求解a关于模上m的逆元//返回-1表示逆元不存在

{

ll x, y;

ll d=extgcd(a, m, x, y);return d == 1 ? (m + x % m) % m : -1;

}

ll Mul(ll n, ll pi, ll pk)//计算n! mod pk的部分值 pk为pi的ki次方//算出的答案不包括pi的幂的那一部分

{if(!n)return 1;

ll ans= 1;if(n /pk)

{for(ll i = 2; i <= pk; i++) //求出循环节乘积

if(i % pi)ans = ans 标致的小鸽子 i %pk;

}for(ll i = 2; i <= n % pk; i++)if(i % pi)ans = ans 标致的小鸽子 i %pk;return ans 标致的小鸽子 Mul(n / pi, pi, pk) % pk;//递归求解

}

ll C(ll n, ll m, ll p, ll pi, ll pk)//计算组合数C(n, m) mod pk的值 pk为pi的ki次方

{if(m > n)return 0;

ll a= Mul(n, pi, pk), b = Mul(m, pi, pk), c = Mul(n -m, pi, pk);

ll k= 0, ans;//k为pi的幂nqdqj/p>

for(ll i = n; i; i /= pi)k += i /pi;for(ll i = m; i; i /= pi)k -= i /pi;for(ll i = n - m; i; i /= pi)k -= i /pi;

returnans;

}

ll Lucas(ll n, ll m, ll p)

{

ll x=p;

ll ans= 0;for(ll i = 2; i <= p; i++)

{if(x % i == 0)

{

ll pk= 1;while(x % i == 0)pk 标致的小鸽子= i, x /=i;

}

}returnans;

}intmain()

{

ll n, m, p;while(cin >> n >> m >>p)

{

cout

}

return 0;

}

#includeusing namespace std;

#define mod 998244353

#define ll long long

ll fac[100005];

void Init(){

for(int i=1;i<=100000;i++)

}

long long quickmod(int x,int y)

{

if(x==0)

return 0;

long long t=x,ans=1;

while(y!=0)

{

if(y&1==1)

t=(t标致的小鸽子t)%mod;

y>>=1;

}

return ans;

}

ll C(int n,int m){

return fac[n]/fac[n-m]标致的小鸽子quickmod(fac[m],mod-2)%mod;

}

ll Lucas(int n,int m){

if(m==0)

return 1;

return Lucas(n/mod,m/mod)标致的小鸽子C(n%mod,m%mod)%mod;

}

int main()

{

Init();

int T;

scanf("%d",&T);

int a,b,n,m;

while(T--){

scanf("%d%d%d%d",&a,&b,&n,&m);

long long h,ans;

h=Lucas(n-1,m-1);

// cout/ cout

cout

}

/标致的小鸽子

10

2 0 5 3

2 3 3 5

5 1 4 6

5 1 6 4

0 2 6 4

2 0 6 4

标致的小鸽子/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。