题目描述
小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M)。
小B 家住在西南角,学校在东北角。现在有T 个路口进行施工,小B 不能通过这些路口。小B 喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走;而小B又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条。由于答案可能很大,所以小B 只需要让你求出路径数mod P 的值。
输入输出格式
输入格式:
第一行为四个整数N、M、T、P。
接下来的T 行,每行两个整数,表示施工的路口的坐标。
输出格式:
一行一个整数,表示路径数mod P 的值。
此题涉及到的数论知识有很多:扩展欧几里得算法、卢卡斯定理(组合数)、中国剩余定理(合并)。
当没有施工点时,答案即C(n+m,m)。
当有施工点时,考虑到j点能影响到i点当且仅当x[i]>=x[j]且y[i]>=y[j]时。影响的路径条数为f[i]=f[i]-f[j]*C(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x),它的解释为:到j点的路径条数乘上j点到i点的路径条数。我们把所有符合条件的j都减去(思考一下这样为什么不会重复减去)。计算之前先sort一遍就可以了,对于取模,卢卡斯定理计算就好了。
但模数不是质数的情况,中国剩余定理合并即可。
Code
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
long long mod,n,m,t,p,jie[],ni[],f[],x,y,a1,a2,a3,a4,ans;
struct fe
{
long long x,y;
}a[];
bool cmp(fe a,fe b)
{
return(a.x==b.x)?(a.y<b.y):(a.x<b.x);
}
long long lucas(long long n,long long m)
{
if(m>n)return ;
if(!m)return ;
if(n<mod)return jie[n]*ni[m]*ni[n-m]%mod;
return lucas(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
void exgcd(long long a,long long b)
{
if(!b)
{
x=;
y=;
return;
}
exgcd(b,a%b);
long long k=x;
x=y;
y=k-a/b*y;
}
long long work1()
{
memset(f,,sizeof(f));
ni[]=ni[]=;
jie[]=;
for(int i=;i<=mod;++i)
{
jie[i]=(jie[i-]*i)%mod;
ni[i]=(mod-mod/i)*ni[mod%i]%mod;
}
for(int i=;i<=mod;++i)
ni[i]=ni[i]*ni[i-]%mod;
for(int i=;i<=t;++i)
{
f[i]=lucas(a[i].x+a[i].y,a[i].x)%mod;
for(int j=;j<i;++j)
if(a[i].x>=a[j].x&&a[i].y>=a[j].y)f[i]=(f[i]-f[j]*lucas(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x)%mod+mod)%mod;
}
return f[t];
}
long long bing(long long a,long long b,long long c)
{
x=;y=;
exgcd(a,c);
x=(x+c)%c;
return x*a%p*b%p;
}
int main()
{
cin>>n>>m>>t>>p;
for(int i=;i<=t;++i)scanf("%lld%lld",&a[i].x,&a[i].y);
a[++t].x=n,a[t].y=m;
sort(a+,a+t+,cmp);
if(p==)
{
mod=p;
cout<<work1();
}
else
{
mod=;a1=work1();
mod=;a2=work1();
mod=;a3=work1();
mod=;a4=work1();
ans=(ans+bing(p/,a1,))%p;//cout<<ans;
ans=(ans+bing(p/,a2,))%p;//<<ans;
ans=(ans+bing(p/,a3,))%p;//cout<<ans;
ans=(ans+bing(p/,a4,))%p;//cout<<ans;
cout<<ans;
}
return ;
}
BJWC2018上学路线的更多相关文章
-
洛谷 P4478 [BJWC2018]上学路线
洛谷 P4478 [BJWC2018]上学路线 原题 神仙题orz,竟然没有1A....容斥+卢卡斯+crt?? 首先用容斥做,记\(f[i][0/1]\)表示到i号点经过了奇数/偶数个点的方案数,因 ...
-
[luogu4478 BJWC2018] 上学路线 (容斥原理+拓展lucas)
传送门 Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路 ...
-
[BJWC2018]上学路线
Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B ...
-
P4478 [BJWC2018]上学路线
Description 小B 所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M). 小B 家住在西南角,学校在东北角.现在有T 个路口进行施工,小B 不能通过这些路口.小B ...
-
Luogu P4478 [BJWC2018]上学路线 卢卡斯+组合+CRT
首先,从$(0,0)$走到$(n,m)$的方案数是$ C_{n+m}^n$,可以把走的方向看作一种序列,这个序列长$ n+m$ ,你需要从中任取$n$个位置,让他向右走: 然后就是如何处理不能走的点: ...
-
codevs2693 上学路线(施工)
难度等级:黄金 2693 上学路线(施工) 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南北方向a条街道从西到东依次编号为1到 ...
-
BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)
第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...
-
BZOJ 3782: 上学路线 [Lucas定理 DP]
3782: 上学路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 192 Solved: 75[Submit][Status][Discuss] ...
-
BZOJ_1266_[AHOI2006]上学路线route_最小割
BZOJ_1266_[AHOI2006]上学路线route_最小割 Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信 ...
随机推荐
-
Java—数组
1 声明数组变量 dataType[] arrayRefVar; 2 实例数组 double[] myArray; 3 创建数组 arrayRefVar =new ...
-
BizTalk 开发系列(四十) BizTalk WCF-SQL Adapter读取SQL Service Broker消息
SQL Service Broker 是在SQL Server 2005中新增的功能.Service Broker 为 SQL Server 提供队列和可靠的消息传递,可以可用来建立以异步消息为基础的 ...
-
Python抓取网页中的图片到本地
今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: #!/usr/bin/env python # -*- coding:utf- -*- # Author: xixihuang # ...
-
IOS s数据存储之归档解档
#import <Foundation/Foundation.h> @interface Student : NSObject <NSCoding>; @property(no ...
-
【面向对象设计原则】之依赖倒置原则(DIP)
依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依赖于抽象.换言之,要针对抽象(接口)编程,而不是针对实现细节编程. 开闭原则( ...
-
java对象拷贝和复制
参考文章:http://blog.csdn.net/XIAXIA__/article/details/41652057 解决问题:深拷贝.浅拷贝 和普通的对象赋值有什么区别? 对象复制 例如:Pers ...
-
python基础之实现sql增删改查
# encoding:utf-8 # Author:"richie" # Date:2017/8/2 import re key_l = ['id', 'name', 'age', ...
-
《JavaScript设计模式与开发实践》知识点笔记
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...
-
tedu训练营day03
Day03笔记1.作业 1.假如你现在25周岁,每年365天,计算你过了多少个星期天(大概数字) 提示 :地板除 2.毕业薪资为10000元,每年涨20%,十年之后你的薪资为多少元? 提示: 幂运算( ...
-
@staticmethod和classmethod
之前一直搞不清楚这两个类方法有什么区别,今天着重学习了一下 @staticmethod是静态方法,不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. class C(object): ...