组合数一

题意

数学知识-组合数_算法

 

 算法思路

C a b 表示从a个苹果中选择b个苹果,假设有一个苹果分开,这个苹果就有选和不选两种方案,分别那么从剩下的a-1个苹果中选择b-1和b个,即 C a-1 b-1 和C a-1 b

数学知识-组合数_i++_02

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7,N=2010;
int c[N][N];

void init()
{
for (int i=0;i<N;i++)
{
for(int j=0;j<=i;j++)
{
if(!j)
c[i][j]=1;
else
c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
}

int main()
{
int i,j,n,a,b;
init();
cin>>n;
while(n--)
{
cin>>a>>b;
cout<<c[a][b]<<endl;
}
return 0;
}

组合数二

题目

数学知识-组合数_i++_03

 

 算法思路

这里的数量级1e5次方,不可以在打表计算

数学知识-组合数_i++_04

 

 

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,N=100010;
typedef long long ll;
int fat[N];
int af[N];
int qsort(int a,int n)
{
int ans=1;
while(n)
{
if(n&1)
ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
n>>=1;
}
return ans;
}

int main()
{
int i,j,n,a,b;
cin>>n;

fat[0]=af[0]=1;
for(i=1;i<N;i++)
{
fat[i]=(ll)fat[i-1]*i%mod;
af[i]=(ll)af[i-1]*qsort(i,mod-2)%mod;
}

while(n--)
{
cin>>a>>b;
cout<<(ll)fat[a]*af[a-b]%mod*af[b]%mod<<endl;
}

return 0;
}

求组合数三

题目

数学知识-组合数_i++_05

 

 算法思路

数学知识-组合数_i++_06

 

 

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
int p;

int qmi(int a,int n)
{
int res=1;
while(n)
{
if(n&1)
res=(ll)res*a%p;
a=(ll)a*a%p;
n>>=1;
}
return res;
}

int C(int a,int b)
{
if(b>a)
return 0;
int res=1;
for(int i=1,j=a;i<=b;i++,j--)
{
res=(ll)res*j%p;
res=(ll)res*qmi(i,p-2)%p;
}
return res;
}

int lucas(ll a,ll b)
{
if(a<p&&b<p)
return C(a,b);
return (ll)C(a%p,b%p)*lucas(a/p,b/p)%p;
}

int main()
{
int i,j,n;
cin>>n;
while(n--)
{
ll a,b;
cin>>a>>b>>p;
cout<<lucas(a,b)<<endl;;
}

return 0;
}

满足条件的01序列

题目

数学知识-组合数_#include_07

 

 算法思路

卡特兰数

数学知识-组合数_i++_08

 

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;

int qsort(int a,int n)
{
int res=1;
while(n)
{
if(n&1)
res=(ll)res*a%mod;
a=(ll)a*a%mod;
n>>=1;
}
return res;
}

int main()
{
int i,j;
int n,a,b;
cin>>n;
a=2*n;
b=n;
int res=1;
for(i=a;i>a-b;i--)
res=(ll)res*i%mod;
for(i=1;i<=b;i++)
res=(ll)res*qsort(i,mod-2)%mod;
res=(ll)res*qsort(n+1,mod-2)%mod;
cout<<res<<endl;
return 0;
}