【BZOJ3782】上学路线

Description

小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M)。小C家住在西南角,学校在东北角。现在有T个路口进行施工,小C不能通过这些路口。小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走;而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条。由于答案可能很大,所以小C只需要让你求出路径数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

1<=N,M<=10^10
0<=T<=200
p=1000003或p=1019663265

题解:从(0,0)走到(n,m)的总方案数=C(n+m,n)。

依旧考虑容斥,先将点排序,用f[i]表示从(0,0)走到(x[i],y[i]),途中不经过其它障碍的方案数,那么如果j在i的左下方,则f[i]-=f[j]*(从j走到i的方案数)。

然而1019663265不是质数?分解质因数的1019663265=3*5*6793*10007,分别求解,再用中国剩余定理合并即可。

EXGCD还能写错~

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. ll mod,ans;
  8. ll n,m,P;
  9. int T;
  10. ll f[210],jc[1000010],jcc[1000010],ine[1000010];
  11. struct node
  12. {
  13. ll x,y;
  14. }p[210];
  15. bool cmp(node a,node b)
  16. {
  17. return (a.x==b.x)?(a.y<b.y):(a.x<b.x);
  18. }
  19. ll C(ll a,ll b)
  20. {
  21. if(a<b) return 0;
  22. if(!b) return 1;
  23. if(a<mod&&b<mod) return jc[a]*jcc[a-b]%mod*jcc[b]%mod;
  24. return C(a%mod,b%mod)*C(a/mod,b/mod)%mod;
  25. }
  26. ll calc()
  27. {
  28. memset(f,0,sizeof(f));
  29. int i,j;
  30. jc[0]=jcc[0]=1;
  31. ine[1]=1;
  32. for(i=2;i<mod;i++) ine[i]=(mod-(mod/i)*ine[mod%i]%mod)%mod;
  33. for(i=1;i<mod;i++) jc[i]=jc[i-1]*i%mod,jcc[i]=jcc[i-1]*ine[i]%mod;
  34. for(i=1;i<=T;i++)
  35. {
  36. f[i]=C(p[i].x+p[i].y,p[i].x);
  37. for(j=1;j<i;j++)
  38. if(p[i].x>=p[j].x&&p[i].y>=p[j].y) f[i]=(f[i]-f[j]*C(p[i].x-p[j].x+p[i].y-p[j].y,p[i].x-p[j].x)%mod+mod)%mod;
  39. }
  40. return f[T];
  41. }
  42. void exgcd(ll a,ll b,ll &x,ll &y)
  43. {
  44. if(!b)
  45. {
  46. x=1,y=0;
  47. return ;
  48. }
  49. exgcd(b,a%b,x,y);
  50. ll tmp=x;
  51. x=y,y=tmp-a/b*x;
  52. }
  53. ll work(ll a,ll c,ll b)
  54. {
  55. ll x,y;
  56. exgcd(a,b,x,y),x=(x+b)%b;
  57. return x*a%P*c%P;
  58. }
  59. int main()
  60. {
  61. scanf("%lld%lld%d%lld",&n,&m,&T,&P);
  62. int i;
  63. for(i=1;i<=T;i++) scanf("%lld%lld",&p[i].x,&p[i].y);
  64. p[++T].x=n,p[T].y=m;
  65. sort(p+1,p+T+1,cmp);
  66. if(P==1000003)
  67. {
  68. mod=P,printf("%lld",calc());
  69. return 0;
  70. }
  71. ll a1,a2,a3,a4;
  72. mod=3,a1=calc();
  73. mod=5,a2=calc();
  74. mod=6793,a3=calc();
  75. mod=10007,a4=calc();
  76. ans=(ans+work(P/3,a1,3))%P;
  77. ans=(ans+work(P/5,a2,5))%P;
  78. ans=(ans+work(P/6793,a3,6793))%P;
  79. ans=(ans+work(P/10007,a4,10007))%P;
  80. printf("%lld",(ans+P)%P);
  81. return 0;
  82. }//3 4 3 1000003 3 0 1 1 2 2

【BZOJ3782】上学路线 组合数+容斥+CRT的更多相关文章

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

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

  2. bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)

    传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782 有部分分的传送门:https://www.luogu.org/problemnew/ ...

  3. bzoj3782上学路线

    题意:从n*m网格图的左下角走到右上角(n,m<=10^10),有t个坐标不能经过(t<=200),只能向上向右走,问有多少种不同的走法,对p取模, p只有两种取值,1000003(质数) ...

  4. Codeforces 100548F - Color (组合数+容斥)

    题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选 ...

  5. BZOJ5306 [HAOI2018]染色 【组合数 + 容斥 + NTT】

    题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只 ...

  6. 【BZOJ4710】[Jsoi2011]分特产 组合数+容斥

    [BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同 ...

  7. cf997C. Sky Full of Stars(组合数 容斥)

    题意 题目链接 \(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数 Sol Orz fjzzq 最后答案是这个 \[3^{n^2} - (3^n - 3)^ ...

  8. BZOJ3782 上学路线

    设障碍个数为,\(obs\)则一般的容斥复杂度为\(O(2^{obs})\).但因为这个题是网格图,我们可以用DP解.设\(f[i]\)表示不经过任何障碍到达第\(i\)个障碍的方案数,转移时枚举可以 ...

  9. HDU - 5201 :The Monkey King (组合数 & 容斥)

    As everyone known, The Monkey King is Son Goku. He and his offspring live in Mountain of Flowers and ...

随机推荐

  1. 我要好offer之 概率题大总结

    1. 利用等概率Rand5生成等概率Rand3 Rand5生成等概率Rand3 这个题目可以扩展为:利用等概率RandM生成等概率RandN (M > N) 这里,我们首先明白一个简单的知识点: ...

  2. 【BZOJ1001】狼抓兔子(平面图最小割转最短路)

    题意:有一张平面图,求它的最小割.N,M.表示网格的大小,N,M均小于等于1000. 左上角点为(1,1),右下角点为(N,M).有以下三种类型的道路  1:(x,y)<==>(x+1,y ...

  3. 【MFC】定时器的使用(转)

    原文转自 http://blog.csdn.net/hellozhd/article/details/8213359 在对话框中使用定时器: 1.定义定时器 #define TIMER1 1 2.开启 ...

  4. 算法 & 数据结构——任意多边形填充

    需求 . 在计算机中,选区是一个很常见的功能,例如windows按住鼠标左键拖动划出矩形选区,Photshop通过钢笔工具任意形状选区.选区本身不过是通过线段闭合的一个几何形状,但是如何填充这个选区, ...

  5. vue 上传文件 和 下载文件

    Vue上传文件,不必使用什么element 的uplaod, 也不用什么npm上找的个人写的包,就用原生的Vue加axios就行了, 废话不多说,直接上代码:html: <input type= ...

  6. PHP的json_encode()函数的引号

    PHP的json_encode()函数的引号 (1)数组的索引和值都使用双引号 $a = ["id"=>1,"age"=>12,"name ...

  7. LeetCode OJ——Word Ladder2

    http://oj.leetcode.com/problems/word-ladder-ii/ class Solution { public: vector<vector<string& ...

  8. WEB学习-CSS中Margin塌陷

    margin的塌陷现象 标准文档流中,竖直方向的margin不叠加,以较大的为准. 如果不在标准流,比如盒子都浮动了,那么两个盒子之间是没有塌陷现象的: 盒子居中margin:0 auto; marg ...

  9. react-native 判断是不是IPhone X

    import { Platform, Dimensions } from 'react-native'; // iPhoneX const X_WIDTH = 375; const X_HEIGHT ...

  10. Javascript 限制文本字节数

    文本限制字数的问题,在实际开发中经常用到;主要问题出现在对中文的限制,下面代码就解决关于限制字节数的校验问题 以下是引用片段: /* value: 值: byteLength:数据库字节长度 titl ...