ZOJ4096 母函数

组合数学 专栏收录该内容
11 篇文章 0 订阅

青岛站金牌题 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5,M=1e9+7;
ll JC[N+10],INV[N+10],Neg[N+10];
ll Pow(ll x,ll y){
    ll ans=1;
    for(;y;y>>=1,x=x*x%M)if(y&1)ans=ans*x%M;
    return ans;
}
ll C(ll x,ll y){
    if(y>x||y<0)return 0;
    return JC[x]*INV[x-y]%M*INV[y]%M;
}
int main(){
    JC[0]=1;for(int i=1;i<=N;++i)JC[i]=JC[i-1]*i%M;
    INV[N]=Pow(JC[N],M-2);for(int i=N-1;i>=0;--i)INV[i]=INV[i+1]*(i+1)%M;
    ll neg=(2*M-Pow(2,M-2))%M;
    Neg[0]=1;for(int i=1;i<=N;++i)Neg[i]=Neg[i-1]*neg%M;
    int T;cin>>T;
    while(T--){
        int n,m;
        scanf("%d%d",&n,&m);
        if(m>n){printf("0\n");continue;}
        if(m==n){printf("%lld\n",JC[n-1]*Pow(2,M-2)%M);continue;}
        int k=n-m;
        ll ans=JC[n]*INV[k]%M,tmp=0;
        for(int i=0;i<=min(k,n-k);++i){
            tmp=(tmp+C(k,i)*Neg[i]%M*C(n-i-1,n-k-i)%M)%M;
        }
        printf("%lld\n",tmp*ans%M);
    }
}

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值