51nod 1627 瞬间移动

题意:

有一个n * m的矩形,一开始从(1, 1)开始,每次能够到达右下方格子的一个格子,求到达(n, m)的方案数。

题解:

很显然最多走min (n - 2, m - 2) + 1步,枚举步数K,答案为 求和 C(n - 2, K - 1) * C(m - 2, K - 1)

代码:

#include <bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 7;
const int N = 1e5 + 7;
#define LL long long

int n, m;
LL F[N], ans;
map <int, LL> inv;

int Pow (int x, int cnt) {
	int ret = 1;
	while (cnt) {
		if (cnt & 1) ret = (LL) ret * x % mod;
		x = (LL) x * x % mod;
		cnt >>= 1;
	}
	return ret;
}

int main () {
	scanf ("%d%d", &n, &m);
	F[0] = 1, inv[0] = 1;
	for (int i = 1; i < N; ++i) {
		F[i] = F[i-1] * i % mod;
		inv[i] = Pow (F[i], mod - 2);
	}
	int lim = min (n - 2, m - 2);
	for (int i = 1; i <= lim + 1; ++i) {
		LL ans1 = F[n-2] * inv[i-1] % mod * inv[n-i-1] % mod;
		LL ans2 = F[m-2] * inv[i-1] % mod * inv[m-i-1] % mod;
		ans = (ans + ans1 * ans2 % mod) % mod;
	}
	cout << ans << endl;
	return 0;
}
时间: 2024-10-21 18:16:00

51nod 1627 瞬间移动的相关文章

Problem 2238 Daxia &amp; Wzc&#39;s problem 1627 瞬间移动

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1627 http://acm.fzu.edu.cn/problem.php?pid=2238 对应的51NOD这个题,先把n--和没m-- 再套公式 #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorit

51nod百度之星2016练习赛

今天看了看51nod发现有这样一个练习赛,就做了做.因为实力太弱想不出E题,各位神犇勿D. A 区间交 不难发现若干线段[li,ri]的交就是[max(li),min(ri)],那么我们考虑枚举min(ri),将ri>=min(ri)的区间按顺序加入,这时我们显然应该选第k小的li来更新答案.这些操作用个堆就可以轻松维护了. 时间复杂度为O(NlogN). #include<cstdio> #include<cctype> #include<queue> #inc

51nod 1201 整数划分(dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题解:显然是一道dp,不妨设dp[i][j]表示数字i分成j个一共有几种分法. 那么转移方程式为: dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] 表示将i - 1划分为j个数,然后j个数都+1 还是不重复,将i - 1划分为j - 1个数,然后j - 1个数都+1,再加上1这个数. 然后就是j的范围要知道1+2+

51nod 1138 连续整数的和(数学)

题目描述: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2).例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8.如果不能写为若干个连续整数的和,则输出No Solution. Input 输入1个数N(3 <= N <= 10^9). OutPut 输出连续整数中的第1个数,如果有多

51nod 1463 找朋友(线段树+离线处理)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1463 题意: 思路: 好题! 先对所有查询进行离线处理,按照右区间排序,因为k一共最多只有10个,所有在该区间内的B数组,每次枚举K值,通过这样的方式来得到另外一个B值.但是这样得到的B值它在B数组中的位置必须在当前数的左边.如下图:(j为当前数在B数组中的位置,pos为计算得到的另一个B值在数组中的位置) 这两个数的和记录在pos中,这里pos的位置必须在j的左边,假

51nod 1437

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1437 1437 迈克步 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 有n只熊.他们站成一排队伍,从左到右依次1到n编号.第i只熊的高度是ai. 一组熊指的队伍中连续的一个子段.组的大小就是熊的数目.而组的力量就是这一组熊中最小的高度. 迈克想知道对于所有的组大小为x(1 ≤ x ≤ n

51nod 1272 思维/线段树

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1272 1272 最大距离 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 给出一个长度为N的整数数组A,对于每一个数组元素,如果他后面存在大于等于该元素的数,则这两个数可以组成一对.每个元素和自己也可以组成一对.例如:{5, 3, 6, 3, 4, 2},可以组成11对,如下(数字为下标):

51nod 1406 位运算/dp

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 有n个整数.输出他之中和x相与之后结果为x的有多少个.x从0到1,000,000 Input 第一行输入一个整数n.(1<=n<=1,000,000). 第二行有n个整数a[0],a[1],a[2],...a[n-1

51nod 1307 绳子与重物(并查集水了一发)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 思路: 可以直接二分答案,然后dfs. 因为标签是并查集,所以我考虑了一下并查集,利用并查集不断向上回溯加负重,居然过了,只能说数据有点水. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #incl