HDU 5698 瞬间移动

题目:

Description

有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第行第列的格子有几种方案,答案对取模。

Input

多组测试数据。

两个整数

Output

一个整数表示答案

Sample Input

4 5

Sample Output

10

首先,很容易求出答案是(m+n-4)!/(m-2)!/(n-2)!

然后就是想办法打表了。

肯定不是真的把阶乘都存起来,因为10000!的十进制有35660位,100000!的位数就更是多的多。

既然这个题目是模1000000007的,那么阶乘也是可以用模1000000007来存的。

最后只剩下1个问题,在模运算下,如何计算除法。

数论里面有个专门解决除法的好东西,叫逆元。

根据费马小定理,用快速幂就可以求出逆元。

代码:

#include<iostream>
using namespace std;

int p = 1000000007;
long long fac[200000];
long long anti[100000];

long long get_mi(long long n,int k)
{
	if (k == 0)return 1;
	long long r = get_mi(n, k / 2) % p;
	r = (r*r) % p;
	if (k % 2)r = (r*n) % p;
	return r;
}

void build()
{
	fac[0] = 1;
	anti[0] = 1;
	for (int i = 1; i < 100000; i++)
	{
		fac[i] = (fac[i - 1] * i) % p;
		anti[i] = get_mi(fac[i], p - 2);	//费马
	}
	for (int i = 100000; i <200000; i++)fac[i] = (fac[i - 1] * i) % p;
}

int main()
{
	build();
	int n, m;
	while (cin >> n >> m)
	{
		long long r = fac[m + n - 4];
		r = (r*anti[m - 2]) % p;
		r = (r*anti[n - 2]) % p;
		cout << r << endl;
	}
	return 0;
}
时间: 2024-10-20 03:06:36

HDU 5698 瞬间移动的相关文章

hdu 5698 瞬间移动(2016&quot;百度之星&quot; - 初赛(Astar Round2B)——数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5698 瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子

HDU 5698 瞬间移动 (2016&quot;百度之星&quot; - 初赛(Astar Round2B) 1003)

传送门 瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 140 Accepted Submission(s): 66 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案

hdu 5698 瞬间移动(排列组合)

这题刚看完,想了想,没思路,就题解了 = = 但不得不说,找到这个题解真的很强大,链接:http://blog.csdn.net/qwb492859377/article/details/51478117 这个我只是看了他的思路,之后代码就自己写,之后交上去就是1A,我感觉好的题解就应该是这样的,Orz 要先看下他的思路,现在我在补充些我的理解: 首先,你要把行,列分开看,先说行,从1到n,1和n都不能走,因为1是开始,n是确定的,所以你有n-2种选择,你可以枚举x从1到n-2,就相当于高中学的

【HDU 5698】瞬间移动(组合数,逆元)

x和y分开考虑,在(1,1)到(n,m)之间可以选择走i步.就需要选i步对应的行C(n-2,i)及i步对应的列C(m-2,i).相乘起来. 假设$m\leq n$$$\sum_{i=1}^{m-2} C_{n-2}^i\cdot C_{m-2}^i=\sum_{i=1}^{m-2} C_{n-2}^i\cdot C_{m-2}^{m-2-i}=C_{n+m-4}^{m-2}$$然后标程里求i的阶乘的逆是预处理的,主要这句:$$f[i]=(M-M/i)\cdot f[M\%i]\%M$$这里f即i

HDU 5698 大组合数取模(逆元)

瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1215    Accepted Submission(s): 600 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几

HDU - 5698

1 #include<iostream> 2 #include<stdio.h> 3 #include<cstring> 4 5 using namespace std; 6 7 #define LL long long 8 const int p = 1000000007; 9 10 LL quick(LL a, LL b) 11 { 12 LL ans = 1; 13 a %= p; 14 while(b) 15 { 16 if(b & 1) 17 { 18

瞬间移动(组合数, 逆元)

瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 263    Accepted Submission(s): 143 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几

hdu 1269 迷宫城堡 强连通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12778    Accepted Submission(s): 5698 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;