组合数一
题意
算法思路
C a b 表示从a个苹果中选择b个苹果,假设有一个苹果分开,这个苹果就有选和不选两种方案,分别那么从剩下的a-1个苹果中选择b-1和b个,即 C a-1 b-1 和C a-1 b
#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;
}
组合数二
题目
算法思路
这里的数量级1e5次方,不可以在打表计算
#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;
}
求组合数三
题目
算法思路
#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<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;
}