E

题解:https://blog.csdn.net/qq_40655981/article/details/104459253

题目大意:n个房间,,每个房间都有一个人,一共k天,在一天,一个人可以到任何一个房间。问n个房间一共有多少个状态。

每个人最多能选择n-1个房间,如果k>=n-1,那么结果就是C(n+m-1,n-1)类似与球盒模型,也就是C(n+n-1,n-1).

如果k<n-1,那么肯定会有n-1-k个人不能移动。我们用总的减去不满足的就行了,设有x个人不动,x~(1,n-1-k)是不满足条件的。

不满足条件的计算 C(n,x)*C(n-1,x-1)(看不懂的话概率轮没有学好,比如我)。

CODE

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll ksm(ll x,ll y){
    ll res=1;
    while(y){
        if(y&1) res=res*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return res%mod;
}
ll cal(ll n,ll m){
    ll sum1=1;
    ll sum2=1;
    for(ll i=1;i<=m;i++) sum1=sum1*i%mod;
    for(ll i=n;i>=n-m+1;i--) sum2=sum2*i%mod;
    return sum2*ksm(sum1,mod-2)%mod;
}
int  main(){
    ll n,k;
    cin>>n>>k;
    if(n-k<=1) cout<<cal(2*n-1,n-1)%mod<<endl;
    else{
        ll toll=cal(2*n-1,n-1)%mod;
        ll tmp1=cal(n,1)%mod;
        ll tmp2=1;
        toll=(toll-tmp1*tmp2%mod+mod)%mod;
        for(ll i=2;i<n-k;i++){
            tmp1=tmp1*(n-i+1)%mod;
            tmp1=tmp1*ksm(i,mod-2)%mod;
            tmp2=tmp2*(n-i+1)%mod;
            tmp2=tmp2*ksm(i-1,mod-2)%mod;
            toll=(toll-tmp1*tmp2%mod+mod)%mod;
        }
        cout<<toll<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Accepting/p/12356882.html