题目描述 小瓜的学校里最近开了一家火锅店,店内设置有小火锅专区,专区有一张大桌子,两侧各有 ? 个座位,每一侧的座位都按照 1 到 n 编号
因为大家比较社恐,所以大家并不想在桌子的同一侧相邻而坐。小瓜想请你计算 m个人坐下吃火锅的方式的数目,由于答案可能很大,因此返回结果对1e9+7取模后的结果即可。
注意,如果一个人坐在桌子某侧的第 ? 个座位,不影响在另一侧的第 ? 个座位坐另一个人。
输入输出格式:
输入格式:
一行两个数n、m,表示有桌子一侧有 n个座位,共 m个人吃饭 输出格式:
只有一行,包括一个整数,表示坐下吃火锅的方式的数目对1e9+7取模后的结果。 输入输出样例 输入样例1:
5 3
输出样例1:
62 样例1说明:
可能的座位情况:
左侧0人,右侧3人,1种坐法
左侧1人,右侧2人,30种坐法
左侧2人,右侧1人,30种坐法
左侧3人,右侧0人,1种坐法
输入样例2:
10 10
输出样例2:
36
样例2说明:
只有一种情况:
左侧5人,右侧5人,36种坐法
测试点
共10个测试点,每个测试点10分。
时间限制2s,空间限制512MB。
数据范围:
对于30%的数据:
1
≤
?
≤
?
≤
1
0
0
1≤m≤n≤100
对于60%的数据:
1
≤
?
≤
?
≤
1
0
0
0
1≤m≤n≤1000
对于100%的数据:
1
≤
?
≤
?
≤
1
0
0
0
0
1≤m≤n≤10000
零分代码:
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=1e4+5;
const ll mod=1e9+7;
ll n,m;
ll qpow(ll x,ll y,ll mo)
{
x%=mo;
ll ans=1;
while(y)
{
if(y&1)
{
ans%=mo;
ans*=x;
ans%=mo;
}
y>>=1;
x%=mo;
x*=x;
x%=mo;
}
return ans%mo;
}
ll inv[100005];
ll fac[100005];
void initfac(ll man)
{
fac[0]=1;
fac[1]=1;
for(int i=1;i<=man;i++)
{
fac[i]=(fac[i-1]*i)%mod;
}
}
ll C(ll n,ll mm)
{
if(mm==0)
{
return 1;
}
return 1ll*(1ll*fac[n]%mod*1ll*qpow(1ll*fac[n-mm],mod-2,mod)%mod*qpow(fac[mm]%mod,mod-2,mod)%mod)%mod;
}
ll tot=0;
int main()
{
cin>>n>>m;
initfac(n);
for(int i=0;i<=ceil(ceil(n*1.0/2.0))&&i<=m;i++)
{
if(m-i>ceil(n*1.0/2.0))
{
continue;
}
tot+=C(n-i+1,i)*C(n-(m-i)+1,m-i);
// cout<<C(n-i+1,i)<<endl;
// cout<<C(n-(m-i)+1,m-i)<<endl;
tot%=mod;
}
cout<<tot%mod<<endl;
return 0;
}