【數學】排列組合
阿新 • • 發佈:2018-12-19
1.排列
2.組合
2.1組合的性質
2.2組合數與楊輝三角形
2.2.1 楊輝三角下的組合數
1.楊輝三角形中第n行,m列的數等於 Cn-1m-1; 2.楊輝三角形中每個數字等於上一行的左右兩個數字之和。即 C(n+1,i)=C(n,i)+C(n,i-1); 3.判斷組合數奇偶:Cn-1m-1(楊輝三角形第n行m列)的奇偶:(m-1)&(n-1)==(m-1)? 奇:偶; 4.第n行的第m個數和第n-m+1個數相等(即見2.1);
2.2.2 楊輝三角形的其他性質
1.第n行的數字有n項; 2.第n行數字和為2n-1; 3.(a+b)n的展開式中的各項係數依次對應楊輝三角的第(n+1)行中的每一項;
2.3錯排問題
3.例題
3.1 1102模擬T1
#include<bits/stdc++.h>
#define mo 1000000007
#define ll long long
using namespace std;
ll n,m,fac[100010],inv[100010],ans=1;
int read(){
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch= getchar();}
return x*f;
}
ll f_pow(int x,int k){
if(k<0) return 0;
if(k==0) return 1;
ll res=x,ans=1;
while(k){
if(k&1) ans=ans*res%mo;
res=res*res%mo;
k/=2;
}
return ans;
}
ll C(int x,int y){
return fac[x]*inv[y]%mo*inv[x-y]%mo;
}
int main(){
n=read(); m=read();
int l,r,k;
fac[0] =1;
for(int i=1;i<=n+1;i++) fac[i]=i*fac[i-1]%mo;
inv[n+1]=f_pow(fac[n+1],mo-2);
for(register int i=n;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mo;
for(int i=1;i<=m;i++){
l=read();r=read();k=read();
ll res=C(r+1,l-k+1)+mo-C(l,l-k+1); if(res>=mo) res-=mo;
ans=ans*res%mo;
}
printf("%lld\n",ans);
return 0;
}
3.2 1101模擬T1
注意任意幾門競賽均可組合,因此要乘組合數
#include<bits/stdc++.h>
#define ll long long
#define mo 1000000007
using namespace std;
int n,a[100010];
ll fac[100010],inv[100010],ans=0;
int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-') f=-1; ch=getchar();}
while(ch<='9'&&ch>='0') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
ll f_mul(int x,int k){
long long res=x,ans=1;
while(k){
if(k&1) ans*=res,ans%=mo;
res*=res,res%=mo;
k=k/2;
}
return ans;
}
ll C(int x,int y){
return fac[x]*inv[y]%mo*inv[x-y]%mo;
}
int main(){
n=read();
for(register int i=1;i<=n;i++) a[i]=read();
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=i*fac[i-1]%mo;
inv[n]=f_mul(fac[n],mo-2);
for(int i=n-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mo;
for(int i=1;i<=n;i++) {
if(i%2==0) ans-=C(n,i)*a[i]%mo;
if(i%2==1) ans+=C(n,i)*a[i]%mo;
if(ans<0) ans+=mo;
ans%=mo;
}
printf("%d",ans);
}