题解: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; }