2276: 跳一跳(思维 + dp + 组合数学)

题目描述

今天跳跳去公园游玩,第一个游戏就难倒了跳跳,游戏规则是跳跳站在一个面积无限大的矩形土地上,开始时跳跳在左上角(即第一行第一列),每一次跳跳都可以选择一个右下方格子,并瞬间跳过去(如从下图中的红色格子能直接跳到蓝色格子),求跳到第n行第m列的格子有多少种方案,答案对1000000007取模。

输入

单组测试数据。 

两个整数n,m(2<=n,m<=100000)

输出

一个整数表示方案数。

样例输入

4 5

样例输出

10

建议大家先看一下我的博客:博客一博客二

两个博客中题目差不多一致但是实现不一样(数据的缘故),但是博客一给我们提供了一个很好的思路去解决这个问题,对于此题我们可以用dp证明

dp[i][j] = dp[i-1][j] + dp[i][j-1];(我的博客中提到过这个就是杨辉大三角)

但是由于数据的缘故没办法用dp进行coding,那怎么办呢?博客二有给我们提供了一个好的思路去解决,使用逆元

AC:代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 200000+5;
#define mod 1000000007
typedef long long ll;

ll fac[maxn];

void get_fac(){
	fac[0] = fac[1] = 1;
	for(int i = 2;i<maxn;i++){
		fac[i] = (fac[i-1]*i)%mod;
	}
}

ll ex_gcd(ll a,ll b,ll &x,ll &y)
{
	if(b == 0){
		x = 1;
		y = 0;
		return a;
	}
	ll temp = ex_gcd(b,a%b,y,x);
	y -= x*(a/b);
	return temp;
}

ll inv(ll s)
{
	ll x,y;
	ex_gcd(s,mod,x,y);
	return (x%mod+mod)%mod;
}

int main()
{
	ll n,m,a,b;
	get_fac();
	scanf("%lld %lld",&n,&m);
	a = n+m-4;
	b = n-2;
	printf("%lld\n",(fac[a]%mod*inv(fac[a-b])%mod*inv(fac[b])%mod+mod)%mod);
	
	return 0;
}



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Acer12138/article/details/80318290
想对作者说点什么? 我来说一句

python跳一跳辅助

2018年03月19日 24.46MB 下载

微信跳一跳

2018年01月11日 50.67MB 下载

一跳辅助v1.0.5

2018年01月19日 1.45MB 下载

一跳C#外挂

2018年02月01日 784KB 下载

一跳Python

2018年01月09日 29.62MB 下载

wechat 跳一跳

2018年01月17日 1.96MB 下载

微信跳一跳源码 一起分享下

2018年01月29日 1.88MB 下载

一跳辅助.net源码

2018年01月23日 21.15MB 下载

微信跳一跳小游戏的源码

2018年01月08日 1.83MB 下载

自制微信跳一跳unity源码

2018年04月23日 62KB 下载

没有更多推荐了,返回首页

不良信息举报

2276: 跳一跳(思维 + dp + 组合数学)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭