数学知识-组合数
组合数一
题意
算法思路
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; }