好讨厌的数学,他哥的,从小到大都要被数学思维狠狠拷打!!!
原来组合数学中插板法的思维是把“板子”也算进去,比如说有k个板子,然后总共要放m个数,那总共的位置就是k+m-1,最后公式是C(k+m-1,m),没办法,数学辣鸡的人就是要被这些大家觉得很简单的公式不断拷打
顺便记忆一下,可重复+不计顺序是C(k+m-1,m)
不可重复加不计顺序是C(k,m);
可重复+计顺序是m的k次
今日每日一题ac代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll MOD=1000000007;
const int MAX=2e6+5;
ll fact[MAX],invfact[MAX];
ll qpow(ll a,ll b){
ll res=1%MOD;
a%=MOD;
while(b>0){
if(b&1) res=res*a%MOD;
a=a*a%MOD;
b>>=1;
}
return res;
}
void init(){
fact[0]=1;
for(int i=1;i<MAX;i++){
fact[i]=fact[i-1]*i%MOD;
}
invfact[MAX-1]=qpow(fact[MAX-1],MOD-2);
for(int i=MAX-2;i>=0;i--){
invfact[i]=invfact[i+1]*(i+1)%MOD;
}
}
ll C(int n,int m){
if(m>n||m<0) return 0;
return fact[n]*invfact[n-m]%MOD*invfact[m]%MOD;
}
void solve(){
int n;
cin>>n;
vector<int>a(n);
for(int i=0;i<n;i++) cin>>a[i];
ll ans=1;
int cnt0=0;
int cur=1000;
for(int i=0;i<n;i++){
if(a[i]==0) {
cnt0++;
}else{
if(cnt0>0){
int L=cur;
int R=a[i];
int k=cnt0;
ans=(ans*C(L-R+k,k))%MOD;
}
cur=a[i];
cnt0=0;
}
}
if(cnt0>0){
int L=cur;
int R=1;
int k=cnt0;
ans=(ans*C(L-R+k,k))%MOD;
}
cout<<ans<<"\n";
}
int main(){
init();
solve();
return 0;
}

浙公网安备 33010602011771号