我们枚举第一个经过的坏点,然后DP即可。

状态转移方程不是难点,难点在于组合数的处理。

将狼踩尽的博客中有很详细的证明过程,但是我只记住了结论

$n=a_1 * p^k+a_2*p^k-1...$

$m=b_1 * p^k+b_2*p^k-1...$

$C(_{m}^{n})=C(_{b_1}^{a_1})*...$

大概的意思就是转化成$p$进制下的每一位做组合数,那么我们就可以预处理阶乘以及它的逆元进行计算。

所以说Lucas只能跑过$10^5$当质数很大的时候就放弃。

如果不是质数,那么可以分解质因数,每一个因数做一次Lucas,然后用CRT合并。

以前留下的大坑终于补完了,EXGCD和CRT终于明白了(真是弱(。・・)ノ)

突然发现namespace写起来挺好用的,以后挂链就用它了

注意 1.n<m时候需要判定,因为%意义下会有小的情况产生。

2.随时取模

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pairnamespace Subtask1{const int p=1000003;ll fac[p],inv[p];void Shaker(){int i;for (fac[0]=1,i=1;i<p;++i)fac[i]=fac[i-1]*i%p;for (inv[1]=1,i=2;i<p;++i)inv[i]=(p-p/i)*inv[p%i]%p;for (inv[0]=1,i=1;i<p;++i)(inv[i]*=inv[i-1])%=p;}ll C(ll n,ll m){if (n<m) return 0;if (n<p&&m<p) return fac[n]*inv[m]*inv[n-m]%p;return C(n%p,m%p)*C(n/p,m/p)%p;}
}namespace Subtask2{const int p=1019663265;int pri[]={3,5,6793,10007};ll fac[4][10007],inv[4][10007],k1=339887755,k2=407865306,k3=673070820,k4=618502650;void Shaker(){int i,j;for (j=0;j<4;++j){int np=pri[j];for (fac[j][0]=1,i=1;i<np;++i)fac[j][i]=fac[j][i-1]*i%np;for (inv[j][1]=1,i=2;i<np;++i)inv[j][i]=(np-np/i)*inv[j][np%i]%np;for (inv[j][0]=1,i=1;i<np;++i)(inv[j][i]*=inv[j][i-1])%=np;}}ll C(ll n,ll m,int j){int np=pri[j];if (n<m) return 0;if (n<np&&m<np) return fac[j][n]*inv[j][m]*inv[j][n-m]%np;return C(n%np,m%np,j)*C(n/np,m/np,j)%np;}ll C(ll n,ll m){ll r1=C(n,m,0),r2=C(n,m,1),r3=C(n,m,2),r4=C(n,m,3);return (r1*k1+r2*k2+r3*k3+r4*k4)%p;}
}struct Point{ll x,y;void read(){scanf("%lld%lld",&x,&y);}
}points[220];bool cmp(Point a,Point b)
{return a.x==b.x?a.y<b.y:a.x<b.x;}ll ksm(ll a,ll b,ll p)
{ll ret=1;for (;b;b>>=1,(a*=a)%=p)if (b&1) (ret*=a)%=p;return ret;
}ll f[220],t,n,m;void solve1()
{using namespace Subtask1;Shaker();F(i,1,t){f[i]=C(points[i].x+points[i].y,points[i].x);F(j,1,i-1) if (points[j].y<=points[i].y){(f[i]-=f[j]*C(points[i].x-points[j].x+points[i].y-points[j].y,points[i].x-points[j].x)%p);f[i]+=p; f[t]%=p;}}
}void solve2()
{using namespace Subtask2;Shaker();F(i,1,t){f[i]=C(points[i].x+points[i].y,points[i].x);F(j,1,i-1) if (points[j].y<=points[i].y){(f[i]-=f[j]*C(points[i].x-points[j].x+points[i].y-points[j].y,points[i].x-points[j].x)%p);f[i]%=p;f[i]+=p; f[t]%=p;}}
}void Finout()
{freopen("in.txt","r",stdin);freopen("wa.txt","w",stdout);
}int main()
{ll p;scanf("%lld%lld%lld%lld",&n,&m,&t,&p);F(i,1,t) points[i].read();++t;points[t].x=n;points[t].y=m;sort(points+1,points+t+1,cmp);if (p==1000003) solve1(); else solve2();cout<<f[t]<<endl;
}

  

转载于:https://www.cnblogs.com/SfailSth/p/6652978.html

BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理相关推荐

  1. 信奥中的数学:孙子定理 中国剩余定理

    孙子定理 中国剩余定理 孙子定理 中国剩余定理_Dreamer Thinker Doer-CSDN博客 中国剩余问题(简介+详解) 中国剩余问题(简介+详解)_dreamzuora的博客-CSDN博客 ...

  2. 孙子定理 中国剩余定理

    孙子定理 摘自:百度百科 目录 定义 解释 解法 数学公式 中国剩余定理 案例 展开 编辑本段 定义 中国古代求解一次同余式组(见同余)的方法.是数论中一个重要定理.又称中国剩余定理. 内容 编辑本段 ...

  3. BZOJ-1951-古代猪文-SDOI2010-费马小定理+欧拉函数+lucas定理+中国剩余定理

    描述 =>G∑(ni),i|nmodP =>G^{\sum {{n\choose i}\text{,i|n}}} modP 分析 k=∑Cin,i|n(modP) k=\sum {C_n^ ...

  4. python中国剩余定理公式_《孙子算经》之物不知数题:中国剩余定理

    1.<孙子算经>之"物不知数"题 今有物不知其数,三三数之剩二,五五数之剩七,七七数之剩二,问物几何? 2.中国剩余定理 定义: 设 a,b,m 都是整数.  如果 m ...

  5. 与数论的厮守04:扩展中国剩余定理

    根据数论的尿性,一般的定理解决不了的问题怎么办?那就拓展一下呗. 我们先看中国剩余定理,它解决的是一堆同余方程:nΞa1(mod b1),nΞa2(mod b2)...nΞak(mod bk),其中b ...

  6. CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 CF338D GCD Table(拓展中国剩余定理,细节处理,2900分) Problem 有一张 n ...

  7. 初等数论--同余方程--同余方程组:中国剩余定理

    初等数论--同余方程--同余方程组:中国剩余定理 博主是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找:如果有错,欢迎指正. 我整理成一个系列:初等数论 ...

  8. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  9. 数论 —— 线性同余方程组与中国剩余定理

    [线性同余方程组] 由若干个线性同余方程构成的线性方程组. 例如: 其解法最早由我国<孙子算经>给出,因此解法称为"孙子定理",又叫"中国剩余定理" ...

最新文章

  1. 这个为生信学习打造的开源Linux教程真香!!!
  2. MediaCodec在Android视频硬解码组件的应用
  3. 【博客话题】技术生涯中的出与入
  4. 天天爱跑步——树上差分
  5. 【正则表达式】正则表达式引发的惨案 回溯 超时 cpu 100
  6. android 录音原始文件_Android 11可能最终会取消Android对视频录制的4GB文件大小限制...
  7. 基于visual Studio2013解决面试题之1102合并字符串
  8. 《C++ Primer Plus》读书笔记之十—类和动态内存分配
  9. mysql工具——mysqlcheck(MYISAM)
  10. oracle rac实例停止,oracle rac启停命令使用实例
  11. windows 下 nginx 的反向代理学习整理
  12. vue怎么和python后端交互_python爬虫与Django框架vue交互的前后端代码详情(励志人生网实例)...
  13. DLL系列6.函数转发器
  14. 简明 jieba 中文分词教程
  15. 一篇文章带你深入了解Dart语言
  16. VSTO 阿炯公文插件 wps/word 插件
  17. 学不会PDF裁剪与PDF拆分?6个方法包你轻松学会
  18. 为什么独立站卖家都在WhatsApp上进行销售?
  19. mac 安装qemu的方法
  20. 【一览表】macOS代号\macOS版本\苹果电脑各型号对应的macOS版本列表

热门文章

  1. (转)WriteOnce and RunAnyWhere
  2. 华为捕苹果,小米做黄雀
  3. C++ 虚函数表浅析
  4. go url 参数编码和解码
  5. Dynamips 7200
  6. 取消IE“已限制此网页运行可以访问计算机的脚本
  7. 蓝筹股、红筹股的含义
  8. pragma pack对齐方式详细介绍
  9. C++创建对象的三种方式
  10. 学设计要学python吗_北京学习Python设计大概需要多长时间能学会