Description

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

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


\((0,0)\to (N,M)\)的路径数是\(C_{n+m}^n\)

\(f[i]\)表示第一个到达的障碍是\(i\)时\((0,0)\to (x_i,y_i)\)的路径数

\[()f[i]=C_{x_i+y_i}^{x_i}-\sum C_{x_i+y+_i-x_j-y_j}^{x_i-x_j}\times f[j](x_j\leq x_i\wedge y_j\leq y_i)
\]

\(1019663265\)一看就不是质数啊$=3\times 5\times 6793\times 10007 $

用中国剩余定理合并


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define M 1000010
using namespace std; LL n,m,t,p,A[M],B[M],inv[M],f[201],ans1,ans2,ans3,ans4; struct vv { LL x,y;} a[201];
bool cmp(vv a,vv b){return (a.x!=b.x? a.x<b.x : a.y<b.y);} LL C(LL x,LL y,LL p)
{
if(y>x) return 0;
if(x<p && y<p) return A[x]*B[y]%p*B[x-y]%p;
return C(x/p,y/p,p)*C(x%p,y%p,p)%p;
} LL solve(LL p)
{
LL ans=0;
A[0]=B[0]=inv[1]=1;
for(int i=2;i<p;i++) inv[i]=(p-p/i)*inv[p%i]%p;
for(int i=1;i<p;i++) A[i]=A[i-1]*i%p;
for(int i=1;i<p;i++) B[i]=B[i-1]*inv[i]%p;
for(int i=1;i<=t;i++)
{
f[i]=C(a[i].x+a[i].y,a[i].x,p);
for(int j=1;j<i;j++) if(a[j].x<=a[i].x && a[j].y<=a[i].y)
f[i]=(f[i]-f[j]*C(a[i].x+a[i].y-a[j].x-a[j].y,a[i].y-a[j].y,p)%p+p)%p;
}
ans=C(n+m,m,p);
for(int i=1;i<=t;i++) ans=(ans-f[i]*C(n+m-a[i].x-a[i].y,n-a[i].x,p)%p+p)%p;
return ans;
} LL ksm(LL x,LL y,LL p)
{
LL z=1;
for(;y>1;y>>=1, x=x*x%p) if(y&1) z=z*x%p;
return x*z%p;
} int main()
{
scanf("%lld%lld%lld%lld",&n,&m,&t,&p);
for(int i=1;i<=t;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
sort(a+1,a+1+t,cmp);
if(p==1000003){ printf("%lld",solve(p)); return 0;}
ans1=solve(3)*(p/3)%p*((p/3)%3)%p; ans4=solve(10007)*(p/10007)%p*ksm(p/10007,10005,10007)%p;
ans2=solve(5)*(p/5)%p*ksm(p/5,3,5)%p; ans3=solve(6793)*(p/6793)%p*ksm(p/6793,6791,6793)%p;
printf("%lld",((ans1+ans2)%p+(ans3+ans4)%p)%p);
}

[BJWC2018]上学路线的更多相关文章

  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. [luogu4478 BJWC2018] 上学路线 (容斥原理+拓展lucas)

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

  4. P4478 [BJWC2018]上学路线

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

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

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

  6. codevs2693 上学路线(施工)

    难度等级:黄金 2693 上学路线(施工) 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南北方向a条街道从西到东依次编号为1到 ...

  7. BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)

    第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...

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

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

  9. BZOJ_1266_[AHOI2006]上学路线route_最小割

    BZOJ_1266_[AHOI2006]上学路线route_最小割 Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信 ...

随机推荐

  1. linux 部署系统通过SecureCRT启动tomcat 控制台中文乱码

    查资料又是查了半天 首先 查看linux 当前系统字符集命令 echo $LANG 查看linux 当前系统语言 locale 网上说的又是下中文包,又是改临时语言,这些不能一概而论,我也觉得我不是中 ...

  2. FastReport.net 使用 Winform WebForm打印

    delphi用的fastreport比较多 所以.net中也研究一下用法,这个打印控件还是很简单的 只要手动设计一下写少许代码就可以打印了 甚至可以写成通用代码 以后就可以不用写代码 安装demo会同 ...

  3. OpenCV2马拉松第9圈——再谈对照度(对照度拉伸,直方图均衡化)

    收入囊中 lookup table 对照度拉伸 直方图均衡化 葵花宝典 lookup table是什么东西呢? 举个样例,假设你想把图像颠倒一下,f[i] = 255-f[i],你会怎么做? for( ...

  4. 简述IOC和AOP的作用

    IOC: 控制反转,是一种设计模式.一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制:第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系.他们的依赖关 ...

  5. CMakeLists.txt install

    本部分是关于ros CMakeLists.txt install  :可参考http://wiki.ros.org/catkin/CMakeLists.txt 1.CMakeLists.txt中的in ...

  6. 修改TOMCAT服务的端口

    1.进入tomcat配置文件的目录 [root@db200 conf]# cd /usr/local/tocat8/conf/ 2.打开配置文件 vim server.xml 找到Connector ...

  7. Tornado框架的简单使用

    一.Tornado Web应用程序的结构 import tornado.web class LoginHandler(tornado.web.RequestHandler): def get(self ...

  8. 使用 jQuery 实现当前页面高亮显示的通栏导航条

    index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  9. mac终端命令--常用快捷键

    Ctrl + c        取消当前行输入的命令,进入下一行.或者中止一个错误的或者发疯的命令 Ctrl + a        光标移动到行首(Ahead of line),相当于通常的Home ...

  10. c++ vector push_back对象的时候存起来的是拷贝[转]

    比如 class C1; vector<C1> vec; C1* p=new C1; vec v1; v1.push_back(&(*p)); delete p; 这里,传进函数的 ...