我们枚举第一个经过的坏点,然后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_pair namespace 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;
}

  

BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理的更多相关文章

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

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

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

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

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

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

  4. 卢卡斯定理&&中国剩余定理

    卢卡斯定理(模数较小,且是质数) 式子C(m,n)=C(m/p,n/p)*C(m%p,n%p)%p 至于证明(我也不会QAQ,只要记住公式也该就好了). 同时卢卡斯定理一般用于组合数取模上 1.首先当 ...

  5. BZOJ 3782 上学路线

    首先这个题需要dp.dp[i]=C(x[i]+y[i],x[i])-Σdp[j]*C(x[i]-x[j]+y[i]-y[j],x[i]-x[j])(x[i]>=x[j],y[i]>=y[j ...

  6. 【bzoj1951】[Sdoi2010]古代猪文 费马小定理+Lucas定理+中国剩余定理

    题目描述 求  $g^{\sum\limits_{k|n}C_{n}^{\frac nk}}\mod 999911659$ 输入 有且仅有一行:两个数N.G,用一个空格分开. 输出 有且仅有一行:一个 ...

  7. Ceizenpok’s formula Gym - 100633J 扩展Lucas定理 + 中国剩余定理

    http://codeforces.com/gym/100633/problem/J 其实这个解法不难学的,不需要太多的数学.但是证明的话,我可能给不了严格的证明.可以看看这篇文章 http://ww ...

  8. hdu 5446 Unknown Treasure Lucas定理+中国剩余定理

    Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  9. 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理

    P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...

随机推荐

  1. 百度地图 v2.1.3申请KEY Android签名证书的sha1值

    今天研究下百度地图,没想到第一步就遇到了问题,升级2.13后,需要Android签名证书的sha1值,网上看了下,发现遇到这问题的童鞋还是很多,官方说的两种方法: 第一种:使用keytool keyt ...

  2. codevs 1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description You are a mouse that lives in a cage in ...

  3. html5文本超过指定行数隐藏显示省略号

    这个很简单,直接贴代码就好了 HTML <span class="name">博客园是一个面向开发者的知识分享社区.自创建以来,博客园一直致力并专注于为开发者打造一个纯 ...

  4. 几句话总结一个算法之RNN、LSTM和GRU

    RNN 一般神经网络隐层的计算是h=g(w * x),其中g是激活函数,相比于一般神经网络,RNN需要考虑之前序列的信息,因此它的隐藏h的计算除了当前输入还要考虑上一个状态的隐藏,h=g(w*x+w' ...

  5. tp5 -- 腾讯云cos简单使用

    因项目需要,本来是需要对接阿里云oss,但因客户错误将云存储买成腾讯云cos,因此简单做了个对象上传使用 首先下载cos的sdk: 三种方式在文档上面都有介绍 SDK 安装有三种方式:Composer ...

  6. Noip2018 考前准备

    目录 基础算法 二分 模拟(未补) 高精(未学习) 搜索(未补) 排序 图论 树的直径 树的重心 最短路算法 Spfa Dijkstra Floyd 最小生成树 kruskal 数论 线性筛 线性筛素 ...

  7. [LUOGU] P1024 选课

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  8. python 发送附件

    #!/usr/bin/env python # encoding: utf-8 #@author: 东哥加油! #@file: sksendmail.py #@time: 2018/8/20 13:3 ...

  9. 009 CSS选择器

    CSS选择器 一.基础选择器 1.通配选择器 * { border: solid; } 匹配文档中所有标签:通常指html.body及body中所有显示类的标签 2.标签选择器 div { backg ...

  10. (27)zabbix自定义图表Graph

    zabbix提供了一个自定义图表的功能,这不是废话么?呵呵~前面文章 讲到的<zabbix简易图表>只能显示单个item的数据图表.如果我们想显示多个信息到一个图表上,那必须使用zabbi ...