传送门

Description

小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M)。

小B 家住在西南角,学校在东北角。现在有T 个路口进行施工,小B 不能通过这些路口。小B 喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走;而小B又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条。由于答案可能很大,所以小B 只需要让你求出路径数mod P 的值。

Input

第一行为四个整数N、M、T、P。

接下来的T 行,每行两个整数,表示施工的路口的坐标。

Output

一行一个整数,表示路径数mod P 的值。

Sample Input

3 4 3 1019663265

3 0

1 1

2 2

Sample Output

8

HINT

Solution

f[i]表示从(0,0)到第i个施工点的可行路径数最终答案为\(f[T+1]\) (设第T+1个为(n,m))

排序后每次用全部路径数-到中间某一个施工点(j)的路径数*j到i的路径数

Code

  1. //By Menteur_Hxy
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<iostream>
  6. #include<algorithm>
  7. #define x first
  8. #define y second
  9. #define int long long
  10. #define F(i,a,b) for(register int i=(a);i<=(b);i++)
  11. #define R(i,a,b) for(register int i=(b);i>=(a);i--)
  12. using namespace std;
  13. typedef pair<int,int> PII;
  14. int read() {
  15. int x=0,f=1; char c=getchar();
  16. while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
  17. while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
  18. return x*f;
  19. }
  20. const int T=210,mod[5]={1000003,3,5,6793,10007},MOD=1019663265;
  21. bool flag;
  22. int f[T],fac[5][1000010],inv[5][1000010],d[5];
  23. PII da[T];
  24. int qpow(int a,int b,int p) {
  25. int t=1;
  26. while(b) {
  27. if(b&1) t=t*a%p;
  28. a=a*a%p; b>>=1;
  29. }
  30. return t;
  31. }
  32. int lucas(int n,int m,int p) {
  33. if(n<m) return 0;
  34. if(n<mod[p]&&m<mod[p]) return fac[p][n]*inv[p][m]%mod[p]*inv[p][n-m]%mod[p];
  35. return lucas(n/mod[p],m/mod[p],p)*lucas(n%mod[p],m%mod[p],p)%mod[p];
  36. }
  37. int C(int n,int m) {
  38. if(!flag) return lucas(n,m,0);
  39. int ans=0;
  40. F(i,1,4) ans=(ans+MOD/mod[i]*qpow(MOD/mod[i],mod[i]-2,mod[i])%MOD*lucas(n,m,i)%MOD)%MOD;
  41. return ans;
  42. }
  43. signed main() {
  44. int n=read(),m=read(),t=read(),p=read(); flag=(p==MOD);
  45. F(i,0,4) {
  46. fac[i][0]=1;
  47. F(j,1,mod[i]-1) fac[i][j]=fac[i][j-1]*j%mod[i];
  48. inv[i][mod[i]-1]=qpow(fac[i][mod[i]-1],mod[i]-2,mod[i]);
  49. R(j,-1,mod[i]-2) inv[i][j]=inv[i][j+1]*(j+1)%mod[i];
  50. }
  51. F(i,1,t) {int a=read(),b=read();da[i]=PII(a,b);} da[++t].x=n,da[t].y=m;
  52. sort(da+1,da+1+t);
  53. F(i,1,t) {
  54. f[i]=C(da[i].x+da[i].y,da[i].x);
  55. F(j,1,i-1) if(da[j].y<=da[i].y)
  56. f[i]=(f[i]-f[j]*C(da[i].x+da[i].y-da[j].x-da[j].y,da[i].x-da[j].x)%p+p)%p;
  57. }
  58. printf("%lld",f[t]);
  59. return 0;
  60. }

[luogu4478 BJWC2018] 上学路线 (容斥原理+拓展lucas)的更多相关文章

  1. 洛谷 P4478 [BJWC2018]上学路线

    洛谷 P4478 [BJWC2018]上学路线 原题 神仙题orz,竟然没有1A....容斥+卢卡斯+crt?? 首先用容斥做,记\(f[i][0/1]\)表示到i号点经过了奇数/偶数个点的方案数,因 ...

  2. BJWC2018上学路线

    题目描述 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B 喜欢走最短的 ...

  3. [BJWC2018]上学路线

    Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B ...

  4. BZOJ3782 上学路线 【dp + Lucas + CRT】

    题目链接 BZOJ3782 题解 我们把终点也加入障碍点中,将点排序,令\(f[i]\)表示从\((0,0)\)出发,不经过其它障碍,直接到达\((x_i,y_i)\)的方案数 首先我们有个大致的方案 ...

  5. P4478 [BJWC2018]上学路线

    Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B ...

  6. Luogu P4478 [BJWC2018]上学路线 卢卡斯+组合+CRT

    首先,从$(0,0)$走到$(n,m)$的方案数是$ C_{n+m}^n$,可以把走的方向看作一种序列,这个序列长$ n+m$ ,你需要从中任取$n$个位置,让他向右走: 然后就是如何处理不能走的点: ...

  7. 【bzoj3782】上学路线 dp+容斥原理+Lucas定理+中国剩余定理

    题目描述 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的 ...

  8. BZOJ 3782: 上学路线 [Lucas定理 DP]

    3782: 上学路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 192  Solved: 75[Submit][Status][Discuss] ...

  9. bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp

    LINK:上学路线 从(0,0)走到(n,m)每次只能向上或者向右走 有K个点不能走求方案数,对P取模. \(1\leq N,M\leq 10^10 0\leq T\leq 200\) p=10000 ...

随机推荐

  1. 全栈JavaScript之路(十)学习 DocumentFragment 类型 节点

    DocumentFragment 类型节点,代表一个文档片段,是一种轻量级的'文档' 对象.能够包括其他类型节点,并有能力訪问.操作当中的节点,可是在文档中没有文档标记,相当于是一个页面不可见的容器. ...

  2. 安卓实训第九天---Activity的复习以及在Onstart里设置网络连接

    今天.首先对Activity的生命周期进行复习: (以下的截图部分是借鉴自赵雅智老师的博客.. .) Activity的完整生命周期自第一次调用onCreate()開始.直至调用onDestroy() ...

  3. Hilbert曲线简单介绍及生成算法

    Hilbert曲线 Hilbert曲线是一种填充曲线,相似的填充曲线还包含Z曲线.格雷码等其它方法.Hilbert曲线根据自身空间填充曲线的特性,能够线性地贯穿二维或者更高维度每一个离散单元.而且只穿 ...

  4. java wait 与 notify sleep

    来自:http://blog.csdn.net/zyplus/article/details/6672775 有适当的代码修改. 在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的 ...

  5. SQL排他锁的解决方案

    SQL排他锁的解决方案 分类: 事务与锁 数据库管理维护2009-04-28 22:41 680人阅读 评论(0) 收藏 举报 sql数据库database服务器killdisk 问题描述: 我有一个 ...

  6. python使用MySQLdb向mySQL批量插入数据的方法

    该功能通过调用mySQLdb python库中的 cursor.executemany()函数完成批量处理. 今天用这个函数完成了批量插入 例程: def test_insertDB(options) ...

  7. jdbc数据库中的增删改

    HttpSession session=request.getSession(); session.setAttribute("currentUser",u.username);/ ...

  8. springboot启动报错:Cannot determine embedded database driver class for database type NONE.

    package cn.zb.test; import org.springframework.boot.SpringApplication; import org.springframework.bo ...

  9. BZOJ 2431 逆序对数列 DP

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...

  10. 关于TJOI2014的一道题——Alice and Bob

    B Alice and Bob •输入输出文件: alice.in/alice.out •源文件名: alice.cpp/alice.c/alice.pas • 时间限制: 1s 内存限制: 128M ...