【HDU 5698】 瞬间移动
【题目链接】
【算法】
用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】 瞬间移动的更多相关文章
- HDU 5698 瞬间移动 数学
瞬间移动 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5698 Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次 ...
- HDU 5698 瞬间移动
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- HDU 5698——瞬间移动——————【逆元求组合数】
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- hdu 5698 瞬间移动(排列组合)
这题刚看完,想了想,没思路,就题解了 = = 但不得不说,找到这个题解真的很强大,链接:http://blog.csdn.net/qwb492859377/article/details/514781 ...
- 【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} ...
- HDU 5698 大组合数取模(逆元)
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- hdu 5698(杨辉三角的性质+逆元)
---恢复内容开始--- 瞬间移动 Accepts: 1018 Submissions: 3620 Time Limit: 4000/2000 MS (Java/Others) Memory Limi ...
- 数论基础之组合数&计数问题
一.组合数:问题引入:现在有 n 个球,取其中的 k 个球,问一共有多少种方式?答案: 公式直观解释:我们考虑有顺序地取出 k 个球:第一次有 n 种选择,第二次有 n-1 种选择,...,第 k 次 ...
- hdu 1269 迷宫城堡 强连通分量
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- 零基础入门学习Python(30)--文件系统:介绍一个高大上的东西
知识点 os,os.path模块中关于文件.目录常用的函数使用方法 在使用os模块,需要先进行import操作: import os os模块中关于文件/目录常用的函数使用方法 函数名 函数作用 示例 ...
- Linux中CentOS网络配置以及与Xshell建立远程连接
为centos配置网络 (1)第一步 点开虚拟机的设置,如下图做相关的设置: 网络连接要选择桥接模式,其他的勾选就按照上图的即可,勾选完成点击确定. (2)第二步 点击VMware的编辑选项,找到“虚 ...
- PHP导出超大的CSV格式的Excel表方案
场景和痛点 说明 我们工作场景都常会导出相关的excel数据,有时候需要大量的数据,10W,100W都有可能 我们现有方案都是直接利用phpexcel等类库来操作,phpexcel的load加载或是写 ...
- python的学习之路(三)
一.set集合#!/usr/bin/env python# *_*coding:utf-8 *_*# Author: harson old_dict = { "#1": {'hos ...
- Atcoder regular Contest 073(D - Simple Knapsack)
Atcoder regular Contest 073(D - Simple Knapsack) 传送门 因为 w1≤wi≤w1+3 这个特殊条件,我们可以将每个重量离散化一下,同时多开一维记录选择的 ...
- 关于必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用异常问题
问题描述: 下午调试代码的时候突然发现页面突然异常了,原本以为是代码哪里写错了,后来通过定位发现MVC,UI界面的Linq异常,即关于必须添加对程序集“System.Runtime, Version= ...
- Codeforces Round #304 (Div. 2)-D. Soldier and Number Game,素因子打表,超时哭晕~~
D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- Codeforces679C. Bear and Square Grid
n<=500,n*n的01矩阵,可以选择一个k*k的矩阵全变1,求最大1联通区域. 敢敢n^3..模拟k*k的矩阵的位置,从左到右扫的时候,每变一个位置只会引起边界的信息变化,就记含边界的k*k ...
- 2017 CCPC 杭州 HDU6265B 积性函数
题目链接 http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf B题 数论题 h(n)=∑ d|n φ(d) × ...
- POJ1328 Radar Installation 解题报告
Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...