首页 > 其他分享 >二项式定理和杨辉三角

二项式定理和杨辉三角

时间:2023-07-11 20:35:17浏览次数:39  
标签:return int 定理 long dfs ans 杨辉三角 二项式 mod

 

杨辉三角

解法1:dfs

使用记忆化搜索,提升dfs效率

代码:

int dfs(int n,int m){
	if(!m)return c[n][m]=1;
	if(m==1)return c[n][m]=n;
	if(c[n][m])return c[n][m];
	if(n-m<m)m=n-m;
	return c[n][m]=(dfs(n-1,m)+dfs(n-1,m-1))%mod;
}

  

解法2:递推

时间复杂度O(n^2),如果n较大,建议使用逆运算的方法

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e4+39+7;
ll a[N][N],n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)a[i][1]=a[i][i]=1;
	for(int i=2;i<=n;i++){
		for(int j=2;j<=n;j++){
			a[i][j]=a[i-1][j]+a[i-1][j-1];
		}
	}
	cout<<a[n][m];
	return 0;
}

  

解法3:逆运算

速度最快,但是涉及到阶乘,所以需要取模

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+1,mod = 1e4+7;
short int fac[N],inv[N];
int quickPow(int a,int n){
	int ans=1;
	a%=mod;
	while(n){
		if(n&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		n>>=1;
	}
	return ans;
}
int c(int n,int m){
	return (fac[n]*inv[m]%mod*inv[n-m]%mod)%mod;
}
int main(){
	int a,b,n,m,k;cin>>a>>b>>k>>n>>m;
	fac[0]=1;
	for(int i=1;i<=n+m;i++){
		fac[i]=(fac[i-1]*i)%mod;
		inv[i]=quickPow(fac[i],mod-2);
	}
	cout<<(quickPow(a,n)%mod*quickPow(b,m)%mod*c(k,n)%mod);
	return 0;
}

  

杨辉三角使用了组合数的第2个性质:C(n,r)=C(n-1,r)+C(n-1,r-1)

杨辉三角的主要应用是二项式定理与dp基础模型

 

二项式定理

二项式定理原式:(a+b)n=sum(C(n,r)*ar*bn-r)=sum(C(n,r)*br*an-r)

下面给出一道例题:P1313 [NOIP2011 提高组] 计算系数

根据二项式定理,直接求得答案

解法1:dfs

又慢又耗空间

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+39+7,mod = 1e4+7;
int c[N][N];
int quickPow(int a,int n){
	int ans=1;
	a%=mod;
	while(n){
		if(n&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		n>>=1;
	}
	return ans;
}
int dfs(int n,int m){
	if(!m)return c[n][m]=1;
	if(m==1)return c[n][m]=n;
	if(c[n][m])return c[n][m];
	if(n-m<m)m=n-m;
	return c[n][m]=(dfs(n-1,m)+dfs(n-1,m-1))%mod;
}
int main(){
	int a,b,k,n,m;cin>>a>>b>>k>>n>>m;
	c[1][0]=c[1][1]=1;
	int ans=1;
	ans*=(quickPow(a,n)*quickPow(b,m))%mod;
	ans*=dfs(k,n)%mod;
	cout<<ans%mod;
	return 0;
}

  

解法2:逆运算

最快且最省空间

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+39+7,mod = 1e4+7;
int fac[N],inv[N];
int quickPow(int a,int n){
	int ans=1;
	a%=mod;
	while(n){
		if(n&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		n>>=1;
	}
	return ans;
}
int c(int n,int m){
	return (fac[n]*inv[m]%mod*inv[n-m]%mod)%mod;
}
int main(){
	int a,b,n,m,k;cin>>a>>b>>k>>n>>m;
	fac[0]=1;
	for(int i=1;i<=n+m;i++){
		fac[i]=(fac[i-1]*i)%mod;
		inv[i]=quickPow(fac[i],mod-2);
	}
	cout<<(quickPow(a,n)%mod*quickPow(b,m)%mod*c(k,n)%mod);
	return 0;
}

  

标签:return,int,定理,long,dfs,ans,杨辉三角,二项式,mod
From: https://www.cnblogs.com/zhanghx-blogs/p/17545823.html

相关文章

  • 【模板】唯一分解定理
    问题描述任何大于\(1\)的正整数都能唯一分解为有限个质数的乘积:          \(N=p_1^{c_1}p_2^{c_2}...p_k^{c_k}\)其中\(p_1,p_2,\dots,p_k\)从小到大排列输入数据      一个数\(n(n\le10^{17})\)输出数据      将其质因数与其次数顺序输出   ......
  • 立体几何八大定理
    线面平行判定定理:平面外一条直线与平面内一条直线平行,则这条直线和这个平面平行。符号语言:\[a\not\subset\alpha,b\subset\alpha,a/\kern-0.10em/b\Longrightarrowa/\kern-0.10em/\alpha\]性质定理:一条直线和平面平行,经过这条直线的平面这这个平面相交,那么这条直线和交......
  • 杨辉三角
    杨辉三角首先可以知道中间数为顶上的两个数字相加还有就是边缘上的数字都为一可以分析出中间的数字都是上面数字与左上数字相加这种题目重要的就是找规律#include<stdio.h>intmain(){ intn; inta[30][30]; while(scanf("%d",&n)!=EOF){ if(n==0){ break......
  • 【补】托勒密定理
    托勒密定理定理内容在数学中,托勒密定理是欧几里得几何学中的一个关于四边形的定理。托勒密定理指出凸四边形两组对边乘积之和不小于两条对角线的乘积,等号当且仅当四边形为圆内接四边形,或退化为直线取得(这时也称为欧拉定理)。狭义的托勒密定理也可以叙述为:圆内接凸四边形两对对边......
  • Lucas 定理
    Lucas定理若\(p\)是质数,则对于任意整数\(1\leqm\leqn\),有:\[\dbinom{n}{m}\equiv\dbinom{n\modp}{m\modp}\times\dbinom{\dfrac{m}{p}}{\dfrac{n}{p}}\pmodp\]证明太难,略。例题\(1\):SP18878题目大意求杨辉三角第\(n\)行中偶数个数与奇数个数。题目分析我们......
  • 威尔逊定理
     威尔逊定理:若p为素数,则p可以整除(p-1)!+1例题1:hdu5391直接套用威尔逊定理,注意n=4的结果是2代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e9+39+7;llquickPow(lla,llb,llm){ llans=1; while(b){ if(b&1)ans=(ans*a)%m......
  • 二项式系数 BINOMIAL COEFFICIENTS
    基本恒等式BASICIDENTITIES符号\({\dbinom{n}{k}}\)就是二次项系数,将此符号读作“\(n\)选取\(k\)”。这种常用说法来源于它的组合解释——从一个有\(n\)个元素的集合选取\(k\)个元素做成子集的方法数。嗯,显然有\({\dbinom{n}{k}}=\dfrac{n(n-1)...(n-k+1)}{k(k-1)......
  • 二项式反演和 Min-Max 反演小记
    二项式反演本质上是某种容斥。结论为:\[f_i=\sum_{j=0}^i(-1)^j\binom{i}{j}g_j\Leftrightarrowg_i=\sum_{j=0}^i(-1)^j\binom{i}{j}f_j\]更常用的形式是\[f_i=\sum_{j=0}^i\binom{i}{j}g_j\Leftrightarrowg_i=\sum_{j=0}^i(-1)^{i-j}\binom{i}{j}f_j\]证明第二个......
  • Arrangement排列•Combination组合•Counting计数•Binomial Theorem二项式定理
    符号C-Combination组合数[1]A-Arrangement(旧教材为P-Permutation)N-Number元素的总个数(自然数集合).M-参与选择的元素个数(M不大于N,两者都是自然数集合).!-Factorial阶乘.Arrangement排列与Combination组合:注意:n,m都是自然数,且m<=n,下同.排列的定义:从n......
  • 一个简单棋盘覆盖定理的证明
    能够用\(1\timesl\)的矩形覆盖\(n\timesm\)棋盘的充要条件是\(l\midn\lorl\midm\)。充分性显然,考虑证明必要性。为了方便,我们将行和列记为\(0\simn-1\)和\(0\simm-1\)。考虑设\((i,j)\)的权值为\(\omega_{l}^{i+j}\),一个\(1\timesl\)的矩形覆盖的区域显然......