首先,从$(0,0)$走到$(n,m)$的方案数是$ C_{n+m}^n$,可以把走的方向看作一种序列,这个序列长$ n+m$ ,你需要从中任取$n$个位置,让他向右走;

然后就是如何处理不能走的点:把点sort一遍,按横纵坐标降序排列,这样前面的点可能会包含后面的点,所以算方案数时时要考虑。

算出来从$(0,0)$到$橙色的点(x,y)$的方案数为$C_{x+y}^x$,再减去蓝色点*蓝色点到橙色点方案数,才是到橙色点的方案数;

注意每条非法路径只会被第一个经过他的非法的点记录。

在最后把每个店的方案数再乘上到终点的代价,就是在模其中一个数意义下的解;

最最后用中国剩余定理合并。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define ll long long
  6. #define R register ll
  7. using namespace std;
  8. inline ll g() {
  9. R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
  10. do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
  11. }
  12. struct node {int x,y;
  13. bool operator <(const node& b) const{return x==b.x?y<b.y:x<b.x;}
  14. } a[];
  15. ll f[],p[],ans[],M[],T[];
  16. ll fac[],inv[];
  17. inline ll C(ll n,ll m,ll p) {
  18. if(n<m) return ; return fac[n]*inv[fac[m]*fac[n-m]%p]%p;
  19. }
  20. inline ll L(ll n,ll m,ll p) {
  21. if(n<m) return ; if(!n) return ;
  22. return L(n/p,m/p,p)*C(n%p,m%p,p)%p;
  23. }
  24. ll n,m,t,mod,tot,S=;
  25. signed main() {
  26. n=g(),m=g(),t=g(),mod=g();
  27. if(mod==) p[++tot]=mod;
  28. else p[]=,p[]=,p[]=,p[]=,tot=;
  29. for(R i=;i<=t;++i) a[i].x=g(),a[i].y=g();
  30. sort(a+,a+t+); for(R i=;i<=tot;++i) S*=p[i];
  31. for(R i=;i<=tot;++i) M[i]=S/p[i]; inv[]=,fac[]=;
  32. for(R k=;k<=tot;++k) {
  33. R P=p[k]; for(R i=;i<P;++i) inv[i]=(P-P/i*inv[P%i]%P)%P;
  34. T[k]=inv[M[k]%P]; for(R i=;i<P;++i) fac[i]=fac[i-]*i%P;
  35. ans[k]=L(n+m,n,P); for(R i=;i<=t;++i) {
  36. f[i]=L(a[i].x+a[i].y,a[i].x,P);
  37. for(R j=;j<i;++j) if(a[j].x<=a[i].x&&a[j].y<=a[i].y)
  38. f[i]+=(P-f[j]*L(a[i].x+a[i].y-a[j].x-a[j].y,a[i].x-a[j].x,P)%P)%P;
  39. f[i]%=P; ans[k]+=P-L(n+m-a[i].x-a[i].y,n-a[i].x,P)*f[i]%P;
  40. } ans[k]%=P;
  41. } ll anss=; for(R i=;i<=tot;++i) anss+=ans[i]*M[i]%mod*T[i]%mod;
  42. printf("%lld\n",anss%mod);
  43. } 

2019.05.18

Luogu P4478 [BJWC2018]上学路线 卢卡斯+组合+CRT的更多相关文章

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

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

  2. P4478 [BJWC2018]上学路线

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

  3. BJWC2018上学路线

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

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

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

  5. [luogu4478 BJWC2018] 上学路线 (容斥原理+拓展lucas)

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

  6. [BJWC2018]上学路线

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

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

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

  8. Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT

    好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...

  9. Luogu [P1958] 上学路线_NOI导刊2009普及(6)

    上学路线_NOI导刊2009普及(6) 题目详见:上学路线_NOI导刊2009普及(6) 这是一道基础的DFS(深搜)题,堪称模板,是新手练习搜索与回溯的好题选. 大致思路:从(1,1)开始搜索,每次 ...

随机推荐

  1. HDU1114(完全背包装满问题)

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. POJ1703(2集合并查集)

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39402   Accepted: ...

  3. nginx中给目录增加密码保护实现程序

    一款nginx中给目录增加密码保护实现程序,可以有效的保护一些目录不被访问,有需要的朋友可参考一下. 了防止一些可能出现存在漏洞的后台脚本暴露,使用验证的方式保护这些文件所在的目录 使用apache的 ...

  4. DNS服务器的配置与管理

    安装DNS服务器: 在"服务器管理器"-"角色"-"添加角色"中安装DNS服务器. 选择DNS服务器 点下一步安装,然后安装 固定服务器IP ...

  5. !important定义为最高级不可替代

    <!DOCTYPE html> /*!important定义为最高级不可替代*/ <html lang="en"> <head> <met ...

  6. Linux Shell 脚本提示:sleep: 无效的时间间隔"1s\r"

    问题:编写好的 Shell 脚本在 Linux 执行时提示报错:sleep: 无效的时间间隔"1s\r" : 原因:若再三确认脚本没有写错,可能是原脚本文件在 Win 下创建编写好 ...

  7. [HDU1711]KMP模板

    解题关键:1.直接套kmp模板即可,注意最后输出的位置,需要在索引的位置+1. 2.next用作数组名在oj中会编译错误, 3.选用g++,只有g++才会接受bits/stdc++.h OJ中g++和 ...

  8. 【总结整理】JQuery小技巧

    var item=$("#content").find(".item");//效率最高 var item=$("#content .item" ...

  9. mysql 表名作为存储过程变量

    mysql默认不支持表名作为变量名,如下所示 delimiter $$ DROP procedure IF EXISTS getDataByDbName $$ CREATE procedure get ...

  10. linux date用法

    读者可以设定特定的格式,格式设定规则:一个加号后接数个标记,每个标记中都有%,其中可用的标记列表和说明如下:  %n : 下一行 %t : 跳格 %H : 小时(00..23) %I : 小时(01. ...