[日常训练] 藏宝路径
【问题描述】
经过你的帮助,小Y终于得到了藏宝图。
藏宝图是一个m*n的网格。宝藏分散在(m,n)、 (m,q)两个地方。小Y、小Z分别在(0,0)、(p,0)两个位置,他们决定每个人去一个地方找宝藏。小Y去(m,n)地,小Z去(m,q)地,其中,p < < <m,q < < <n。小Y和小Z只能沿着坐标系中整数组成的网格向x轴或者y轴的正方向爬行。
小Y想知道,在两人所走的路径不重叠(两条路径没有相交的地方)的情况有多少种?
【输入格式】
输入一行,依次为m、n、p、q,都是小于100000的正整数。
###【输出格式】
输出一行一个数,表示所有情况的数量 模(mod) 质数100,000,007的结果。
【输入输出样例】
path.in
3 2 1 1
path.out
6
【样例说明】
当小Y走 ( 0 , 0 ) → ( 0 , 2 ) → ( 3 , 2 ) (0,0) \to (0,2) \to (3,2) (0,0)→(0,2)→(3,2)时,小Z有3种走法: ( 1 , 0 ) → ( 1 , 1 ) → ( 3 , 1 ) (1,0) \to (1,1) \to (3,1) (1,0)→(1,1)→(3,1) ( 1 , 0 ) → ( 2 , 0 ) → ( 2 , 1 ) → ( 3 , 1 ) (1,0) \to (2,0) \to (2,1) \to (3,1) (1,0)→(2,0)→(2,1)→(3,1) ( 1 , 0 ) → ( 3 , 0 ) → ( 3 , 1 ) (1,0) \to (3,0) \to (3,1) (1,0)→(3,0)→(3,1)类似的:
小Y还可以走 ( 0 , 0 ) → ( 0 , 1 ) → ( 1 , 1 ) → ( 1 , 2 ) → ( 3 , 2 ) (0,0) \to (0,1) \to (1,1) \to (1,2) \to (3,2) (0,0)→(0,1)→(1,1)→(1,2)→(3,2),此时小Z有2种走法。
小Y还可以走 ( 0 , 0 ) → ( 0 , 1 ) → ( 2 , 1 ) → ( 2 , 2 ) → ( 3 , 2 ) (0,0) \to (0,1) \to (2,1) \to (2,2) \to (3,2) (0,0)→(0,1)→(2,1)→(2,2)→(3,2),此时小Z有1种走法。
所以,共6种。
【数据规模】
对于20%的数据,m+n小于10。
对于50%的数据,m+n小于20。
对于70%的数据,m+n小于20000。
对于100%的数据,m+n小于200000。
【分析】组合数学 + 费马小定理
- 首先我们不考虑路径相交的问题,则从 ( 0 , 0 ) (0, 0) (0,0)走到 ( m , n ) (m, n) (m,n)共有 C m + n n C_{m + n}^n Cm+nn或 C m + n m C_{m + n}^m Cm+nm条路径(两者等价,表示共走 m + n m + n m+n步,选择 n n n步向上走或选择 m m m步向右走的方案数)
- 接下来我们先算出总的路径数,再减去不合法的相交路径数
- 一种不合法的相交路径如下图
- 实际上也就相当于分为从 ( 0 , 0 ) (0, 0) (0,0)到 ( m , q ) (m, q) (m,q)和从 ( p , 0 ) (p, 0) (p,0)到 ( m , n ) (m, n) (m,n)两条路径,如下图
- 则最后的答案为
C m + n n × C m − p + q q − C m + q q × C m − p + n n C_{m + n}^n \times C_{m - p + q}^q - C_{m + q}^q \times C_{m - p + n}^n Cm+nn×Cm−p+qq−Cm+qq×Cm−p+nn - 但这里计算组合数 C C C要用到除法,而我们又要对其取模,则又要引出一个概念:费马小定理
- 设模数为 p p p(要求为素数),则 1 a ( m o d    p ) = a p − 2 ( m o d    p ) \frac{1}{a} (\mod\ p) = a^{p - 2} (\mod\ p) a1(mod p)=ap−2(mod p)
- 那么 C n m ( m o d    p ) = n ! m ! × ( n − m ) ! ( m o d    p ) C_n^m(\mod\ p) = \frac{n!} {m! \times (n - m)!} (\mod\ p) Cnm(mod p)=m!×(n−m)!n!(mod p) = n ! × ( m ! × ( n − m ) ! ) p − 2 ( m o d    p ) = n! \times (m! \times (n - m)!)^{p - 2} (\mod\ p) =n!×(m!×(n−m)!)p−2(mod p)
- 我们就可以预处理出 x ! ( 0 ≤ x ≤ 200 , 000 ) x!(0 \le x \le 200,000) x!(0≤x≤200,000),直接用快速幂计算答案即可
【代码】
#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;
typedef long long ll;
const ll Mod = 1e8 + 7;
const int N = 2e5 + 5;
ll f[N]; int n, m, p, q;inline ll Pow(ll x, ll k)
{ll res = 1;while (k){if (k & 1) (res *= x) %= Mod;(x *= x) %= Mod; k >>= 1;}return res;
}inline ll C(const int n, const int m)
{return f[n] * Pow(f[m] * f[n - m] % Mod, Mod - 2) % Mod;
}int main()
{freopen("path.in", "r", stdin);freopen("path.out", "w", stdout);f[1] = f[0] = 1; scanf("%d%d%d%d", &m, &n, &p, &q);for (int i = 2; i <= n + m; ++i) f[i] = (f[i - 1] * i) % Mod;cout << (C(m + n, n) * C(m - p + q, q) % Mod - C(m + n - p, n) * C(m + q, q) % Mod + Mod) % Mod << endl;fclose(stdin); fclose(stdout);return 0;
}
[日常训练] 藏宝路径相关推荐
- codeforces日常训练 C. Cutting Out - 二分搜索答案
codeforces日常训练 C. Cutting Out - 二分搜索答案 题干 You are given an array s consisting of n integers. You hav ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- 「日常训练」 Mike and Fun (CFR305D2B)
题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...
- 2018集训队日常训练1
5385: 树的遍历 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte Total Submit: 22 ...
- 动规日常训练题解 难度普及+
9.6 动规训练 题解 ----Frosty_Jackal 定义Dpmax[i][j] 表示l~r之间最大的得分,由题意得拆环为链,将1~n的枚举范围扩大到1~2*n ,外层枚举区间长,内层枚举l, ...
- 【日常训练】427. 建立四叉树
题目 给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成.请你用四叉树表示该矩阵 grid . 你需要返回能表示矩阵的 四叉树 的根结点. 注意,当 isLeaf 为 False 时 ...
- 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)
题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...
- 「日常训练」Skills(Codeforce Round #339 Div.2 D)
题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...
- 「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)
题意与分析 (CodeForces - 603A) 这题真的做的我头疼的不得了,各种构造样例去分析性质... 题意是这样的:给出01字符串.可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所 ...
最新文章
- Linux中mmap与munmap函数系统调用
- 如何彻底关闭windows update
- CountUp.js – 让数字以非常有趣的动画方式显示
- BZOJ2819 Nim
- JavaScript之事件的绑定与移除
- 揭秘腾讯会议背后的视频编码“神器”
- 进击吧! Blazor !第四期 组件开发
- linux编译mesa,如何在Ubuntu 16.04,17.10中安装Mesa 17.3.3
- python开发视频大全_2019年python开发编程21天快速入门视频教程+书籍大全和面试大礼包...
- Bootstrap3 表单
- 服务器ip算是虚拟资产吗,云服务器算资产吗
- Switch case 超经典练习题
- 小米路由器青春版开启SSH刷入Padavan固件
- 通过尾注设置参考文献
- 地震了,地震了!!!
- 观看加勒比海盗惊涛怪浪在线高清串流最快
- 时间序列的分析及滚动预测代码
- 数据库操作--已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行
- 初级开发人员的缺点_成为成功的初级开发人员的10条最佳建议
- 【论文写作】Latex在线创作工具overleaf及账号注册办法