好讨厌的数学,他哥的,从小到大都要被数学思维狠狠拷打!!!

原来组合数学中插板法的思维是把“板子”也算进去,比如说有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;
}
posted @ 2026-01-29 14:08  leeezhusl  阅读(2)  评论(0)    收藏  举报