站外题求助(玄关)
  • 板块学术版
  • 楼主zjy102512
  • 当前回复10
  • 已保存回复10
  • 发布时间2024/7/27 18:48
  • 上次更新2024/7/27 20:12:05
查看原帖
站外题求助(玄关)
931394
zjy102512楼主2024/7/27 18:48

题目描述 小瓜的学校里最近开了一家火锅店,店内设置有小火锅专区,专区有一张大桌子,两侧各有 ? 个座位,每一侧的座位都按照 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;
 }
2024/7/27 18:48
加载中...