D. Dandelion---(路径计数--组合数问题)

Dandelion

time limit per test 1.0 s
memory limit per test 256 MB
题目链接http://whu2019.contest.codeforces.com/group/YyBKO8xFiH/contest/102167/problem/D
。。。。不知道没有专用账户进不进得了了现在。。。
在这里插入图片描述
在这里插入图片描述


题目大意:给你一个坐标(x,y),计算从(0,0)到(x,y)总共有多少种走法,它可以向下和向右走,且它能走路径必须是x<y。
如图,它的路径范围就变成了这样:
在这里插入图片描述
对于这一题,它相当于组合数的问题。假设我们的方格数是完整的,那么总的路径数为C(m+n-1,m),因为有一条边是无用的,我们将这条(0,0)-(0,1)-(0,2)合并为一条,则相当于在m个竖线和n-1个横线中挑选m个或n-1个。那么总的路径就出来了:C(m+n-1,m)。

接下来的难点在于扣去非法的路径数。我们知道,一旦有路径落入空白部分则非法,那么对于m个竖线的情况又(m<n)如图,则有m-1种情况落入空白部分,所以非法路径数为:C(n+m-1,m-1).
在这里插入图片描述
那么接下来就是求组合数的问题了,为了不超时超空间,而且它的T很小,所以可以直接线性暴力(当然,就算是暴力,我们的组合数也要优化):
在这里插入图片描述
那么本层的各个点为:

c[0]=1;
for (int i=1; i<=n; i++) c[i]=c[i-1]*(n-i+1)/i;

由于要取模,所以要求i的乘法逆元:

inv[1]=1;
for (int i=2; i<=mac; i++) {
	inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}

那么本题就结束了:

#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
const int mac=1e5+5;
const int mod=1e9+7;
ll f[mac*2],inv[mac*2];
ll C(ll x,ll y);
int main()
{
	ll t,n,m;
	inv[1]=1;
	for (int i=2; i<=mac; i++){
		inv[i]=(mod-mod/i)*inv[mod%i]%mod;
	}   
	scanf ("%lld",&t);
	while (t--){
		scanf ("%lld%lld",&m,&n);//m<n;
		ll ans=(C(m+n-1,m)-C(m+n-1,m-1)+mod)%mod;
		printf ("%lld\n",ans);
	}
	
	return 0;
}
ll C(ll x,ll y)
{
	memset(f,0,sizeof(f));
	f[0]=1;
	for (int i=1; i<=y; i++){
		f[i]=(f[i-1]*((x-i+1)*(inv[i]%mod)%mod))%mod;//求C(n+m-1,i); 
	}
	return f[y];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dandelion-optimizer是一种基于多样性优化技术的优化算法。在解决优化问题时,传统的算法往往陷入局部最优解的困境,而dandelion-optimizer通过引入多样性,能够更好地搜索全局最优解。 dandelion-optimizer的原理类似于蒲公英的传播方式。在蒲公英花朵中,种子会从母本花朵的果穗中脱离,通过风的力量进行传播。在优化问题中,种子代表解空间的候选解,而风则表示优化的方向。dandelion-optimizer通过种子的传播和风的力量相结合,来改善搜索过程。 具体来说,dandelion-optimizer首先初始化一组随机解,即种子。然后,通过计算适应度函数来评估每个种子的优劣。接下来,算法会根据适应度值选择一些优秀的种子作为"母本",同时根据一定规则生成一些新的解作为"子代"。这样,种子就会根据它们的适应度被推动到更好的解空间中。 而为了引入多样性,dandelion-optimizer会在每一代中引入一些随机解,即通过"风"的力量随机传播的种子。这样一来,算法就能够避免陷入局部最优解,并尽可能地搜索全局最优解。 总的来说,dandelion-optimizer是一种能够通过多样性优化技术来改善优化问题搜索的算法。它通过引入种子的传播和风的力量来提高解空间的搜索效率,并且能够避免陷入局部最优解。通过这种方式,dandelion-optimizer能够更好地找到全局最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值