容斥算出来是0求助
查看原帖
容斥算出来是0求助
275860
___A__楼主2024/5/26 12:25
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=25,mod=1e9+7;
int n,m,a[N],ans,num,fac=1;
int ksm(int x,int n){
    int ret=1;
    while(n){
        if(n%2){
            ret=ret*x%mod;
        }
        x=x*x%mod,n/=2;
    }
    return ret;
}
int C(int x){
    int ret=fac;
    for(int i=x-n+2;i<=x;i++){
        ret=ret*i%mod;
    }
    return ret;
}
signed main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=1;i<n;i++){
        fac=fac*i%mod;
    }
    fac=ksm(fac,mod-2),ans=C(m+n-1);
    for(int i=0;i<(1<<n);i++){//0代表没有满足这个限制
        int sign=1,tmp=m;
        for(int j=0;j<n;j++){
            if((i>>j)&1){
                tmp++,sign*=-1;
            }
            else{
                tmp-=a[j];
            }
        }
        num=(num+sign*C(tmp-1))%mod;
    }
    cout<<((ans-num)%mod+mod)%mod;
}
2024/5/26 12:25
加载中...