【题目链接】

点击打开链接

【算法】

用f[i][j]表示走到(i,j)这个位置有多少种方案,因为走到(i,j)这个位置,上一步一定在它左上角的矩形中,所以,

f(i,j) = sigma( f(x,y) ) ( (x,y)在左上角的矩形中)

我们尝试将它画出来,发现是斜着的杨辉三角

然后,通过找规律,我们发现 : f(n,m) = C(n+m-4,n-2)

求C函数的值,这里有一种方法 :

C(n,r) mod P = (n! / (n - r)! / r!) mod P

= (n!) mod P * inv( (n - r)! ) mod P * inv( r! ) mod P( 其中,inv表示乘法逆元 )

考虑预处理阶乘和阶乘逆元

阶乘很容易求,那么,阶乘逆元怎么求呢?

这里有一种线性求阶乘逆元的方法 ( 如果我们要求 inv( n! ) ) :

inv(n ! ) = inv( (n - 1)! n )

= inv( (n - 1)! ) inv( n )

所以 inv( (n - 1)! ) = inv( n ! ) * inv( inv( n ) )

= inv( n! ) * n

有了这个式子,我们便可以在线性时间内求出所有的阶乘逆元

这一题,我们只要预处理阶乘和阶乘逆元,然后,O(1)回答询问,即可

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
const long long P = ; long long n,m;
long long fac[MAXN],inv[MAXN]; inline long long power(long long a,long long n)
{
long long ans = ,b = a;
while (n > )
{
if (n & ) ans = (ans * b) % P;
b = (b * b) % P;
n >>= ;
}
return ans;
}
inline void init()
{
int i;
fac[] = ;
for (i = ; i < MAXN; i++) fac[i] = fac[i-] * i % P;
inv[MAXN-] = power(fac[MAXN-],P-);
for (i = MAXN - ; i >= ; i--) inv[i] = inv[i+] * (i + ) % P;
}
inline long long C(long long n,long long m)
{
if (!m) return ;
else if (n == m) return ;
else return fac[n] * inv[n-m] % P * inv[m] % P;
} int main() { init();
while (scanf("%d%d",&n,&m) != EOF)
{
printf("%lld\n",C(n+m-,n-));
} return ; } /*
f( n! ) = f( (n-1)! n) = f( (n - 1)! ) f(n)
f( n! ) * f( f(n) ) = f( (n - 1)! )
f( n! ) * n = f( (n - 1)! )
f( n! ) = f ( (n + 1)! ) * (n + 1)
*/

【HDU 5698】 瞬间移动的更多相关文章

  1. HDU 5698 瞬间移动 数学

    瞬间移动 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5698 Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次 ...

  2. HDU 5698 瞬间移动

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  3. HDU 5698——瞬间移动——————【逆元求组合数】

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

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

    这题刚看完,想了想,没思路,就题解了 = = 但不得不说,找到这个题解真的很强大,链接:http://blog.csdn.net/qwb492859377/article/details/514781 ...

  5. 【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} ...

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

    瞬间移动 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  7. hdu 5698(杨辉三角的性质+逆元)

    ---恢复内容开始--- 瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limi ...

  8. 数论基础之组合数&计数问题

    一.组合数:问题引入:现在有 n 个球,取其中的 k 个球,问一共有多少种方式?答案: 公式直观解释:我们考虑有顺序地取出 k 个球:第一次有 n 种选择,第二次有 n-1 种选择,...,第 k 次 ...

  9. hdu 1269 迷宫城堡 强连通分量

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. shell脚本、if语句、for循环语句

    shell在shell脚本中,如果用户不输入东西,系统不自动退出,this is a bug!文件测试语句:-d -f -r -w -x -e逻辑测试语句:“&&”与(同时满足) “| ...

  2. Reparameterization Trick

    目录 Sample() is not differentiable Reparameterization trick Too Complex Sample() is not differentiabl ...

  3. LeetCode(61) Rotate List

    题目 Given a list, rotate the list to the right by k places, where k is non-negative. For example: Giv ...

  4. (转载)C++ string中find() ,rfind() 等函数 用法总结及示例

    string中 find()的应用  (rfind() 类似,只是从反向查找) 原型如下: (1)size_t find (const string& str, size_t pos = 0) ...

  5. javaWeb学习之 Filter过滤器----https://www.cnblogs.com/xdp-gacl/p/3948353.html

    https://www.cnblogs.com/xdp-gacl/p/3948353.html

  6. 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...

  7. bash shell & front-end & auto publish & auto deploy

    bash shell & front-end & auto publish & auto deploy $ zip -r apitool-2018-11-22.zip apit ...

  8. Django:(7)auth用户认证组件 & 中间件

    用户认证组件 用户认证组件: 功能:用session记录登陆验证状态 前提:用户表:django自带的auth_user 创建超级用户的命令: python manage.py createsuper ...

  9. Linux下汇编语言学习笔记31 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. Codeforces 22E(图论)

    题意: 给出n个节点,以及和这个节点指向的节点fi,表示从i能够到达fi,问至少需要添加多少条边能够使得原图变为强连通分量, 输出边数及添加的边,多解输出任意一组解. 2 <= n <= ...