传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3782

有部分分的传送门:https://www.luogu.org/problemnew/show/P4478

看到标题开始还以为是AHOI的小雪和小可可……

题解:乍一看会40pts:测试点1、2:n,m<=1000的直接O(nm)DP;测试点3、4:没有障碍物直接C(n+m,n),然后p=1e6+3是质数可以直接取模。

想了几分钟会60pts:测试点5、6:模数可以拆成几个不超过1e5的质数的乘积,直接算出C(n+m,n)对每个质数的模数,然后CRT合并一下就行了。

不会CRT的左转,我原来也是看这个博客学的:https://blog.csdn.net/niiick/article/details/80229217

其实满分也很可做,容斥一下就行了:把障碍物按x从小到大,x相同按y从小到大排序,然后f[i]表示不经过前(i-1)个障碍物但经过第i个障碍物的方案,然后增加最后一个点为(n,m),然后可以计算f[i]=C(x[i]+y[i],y[i])+Σf[j]C(x[i]-x[j]+y[i]-y[j],x[i]-x[j]),其中j满足x[j]<=x[i]&&y[j]<=y[i],这个计算由于T<=200算组合数+CRT合并也不会超时,复杂度O(T^2log)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+;
struct node{ll x,y;}a[N];
ll n,m,P,f[N],p[],fac[][N],inv[][N],mul[],imul[],g[];
int num,tp;
bool cmp(node a,node b){return a.x==b.x?a.y<b.y:a.x<b.x;}
ll qpow(ll a,ll b,ll p)
{
ll ret=;
while(b)
{
if(b&)ret=ret*a%p;
a=a*a%p,b>>=;
}
return ret;
}
ll c(ll a,ll b,int i)
{
if(a<b)return ;
if(a<p[i]&&b<p[i])return fac[i][a]*inv[i][b]%p[i]*inv[i][a-b]%p[i];
return c(a%p[i],b%p[i],i)*c(a/p[i],b/p[i],i)%p[i];
}
ll C(ll a,ll b)
{
if(!tp)return c(a,b,);
ll ret=;
for(int i=;i<=;i++)g[i]=c(a,b,i);
for(int i=;i<=;i++)ret=(ret+g[i]*mul[i]%P*imul[i]%P)%P;
return ret;
}
int main()
{
scanf("%lld%lld%d%lld",&n,&m,&num,&P);
for(int i=;i<=num;i++)scanf("%lld%lld",&a[i].x,&a[i].y);
a[++num]=(node){n,m};
sort(a+,a+num+,cmp);
if(P==1e6+)p[]=1e6+;else p[]=,p[]=,p[]=,p[]=,tp=;
if(tp)
{
for(int i=;i<=;i++)
{
mul[i]=P/p[i],imul[i]=qpow(mul[i],p[i]-,p[i]);
fac[i][]=;for(int j=;j<p[i];j++)fac[i][j]=fac[i][j-]*j%p[i];
inv[i][p[i]-]=qpow(fac[i][p[i]-],p[i]-,p[i]);
for(int j=p[i]-;j;j--)inv[i][j-]=inv[i][j]*j%p[i];
}
}
else{
fac[][]=;for(int i=;i<P;i++)fac[][i]=fac[][i-]*i%P;
inv[][P-]=qpow(fac[][P-],P-,P);
for(int i=P-;i;i--)inv[][i-]=inv[][i]*i%P;
}
for(int i=;i<=num;i++)
{
f[i]=C(a[i].x+a[i].y,a[i].x);
for(int j=;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[j].x+a[i].y-a[j].y,a[i].x-a[j].x)%P+P)%P;
}
printf("%lld",f[num]);
}

bzoj3782上学路线(Lucas+CRT+容斥DP+组合计数)的更多相关文章

  1. BZOJ 3782: 上学路 Lucas+ExCRT+容斥+dp

    其实呢,扩展中国剩余定理还有一种理解方式:就是你有一坨东西,形如:$A[i]\equiv B[i](mod$ $P[i])$. 对于这个东西,你可以这么思考:如果最后能求出一个解,那么这个解的增量一定 ...

  2. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

  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. CF1043F Make It One 容斥+dp+组合

    考试的时候考的一道题,感觉挺神的. 我们发现将所有数去重后最多只会选不到 $7$ 后 $gcd$ 就会变成 $1$. 令 $f[i][k]$ 表示选 $i$ 个数后 $gcd$ 为 $k$ 的方案数. ...

  5. 2017多校第8场 HDU 6143 Killer Names 容斥,组合计数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6143 题意:m种颜色需要为两段长度为n的格子染色,且这两段之间不能出现相同的颜色,问总共有多少种情况. ...

  6. HDU 5794 A Simple Chess (容斥+DP+Lucas)

    A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...

  7. [CF1086E]Beautiful Matrix(容斥+DP+树状数组)

    给一个n*n的矩阵,保证:(1)每行都是一个排列 (2)每行每个位置和上一行对应位置不同.求这个矩阵在所有合法矩阵中字典序排第几.考虑类似数位DP的做法,枚举第几行开始不卡限制,那么显然之前的行都和题 ...

  8. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  9. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

随机推荐

  1. 在编写wpf界面时候中出现如下错误: 类型引用不明确。至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualStateManager”的类型。请考虑调整程序集 XmlnsDefinition 特性。

    wpf中类型引用不明确.至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualState 你是不是用了WPFToolKit?如果是的,那原因 ...

  2. Java之ArrayList自定义排序,通过实现comparator比较器接口

    两种排序方式: 1.实体类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.sort()来排序对象数组 2.在调用方法的 ...

  3. Appium之编写H5应用测试脚本(切换到Webview)

    App使用H5编写,默认方式找不到元素.启动后获取所有上下文,找到webivew_xxxx的,然后进行切换. 源码: package MyAppium; import io.appium.java_c ...

  4. oracle11g安装教程完整版

    来自: https://www.2cto.com/database/201701/588135.html 64位WIN7+oracle11g+plsql安装 1.下载Oracle 11g R2 for ...

  5. Python——glob模块

    一.作用: 找到匹配上特定格式的所有文件和文件夹,跟windows的文件搜索功能差不多 二.三种匹配符 *代表0个或多个字符 ?代表一个字符 []匹配指定范围内的字符,如[0-9]匹配数 三.应用方法 ...

  6. 学习 Spring (十四) Introduction

    Spring入门篇 学习笔记 Introduction 允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象 由 中的 元素声明该元素用于声明所匹配的类型拥有一个新的 p ...

  7. openwrt-scripts/config/mconf: Syntax error: “(” unexpected错误解决

    scripts/config/mconf: Syntax error: “(” unexpected错误解决 从其他地方复制而来的openwrt SDK,放在本地执行make menuconfig时出 ...

  8. [51Nod 1584] 加权约数和

    Description 在整理以前的试题时,他发现了这样一道题目:"求 \(\sum\sigma(i)\),其中 \(1≤i≤N\),\(σ(i)\) 表示 \(i\) 的约数之和.&quo ...

  9. 基准对象object中的基础类型----数字 (二)

    object有如下子类: CLASSES object basestring str unicode buffer bytearray classmethod complex dict enumera ...

  10. ☆ [NOIp2016] 天天爱跑步 「树上差分」

    题目类型:LCA+思维 传送门:>Here< 题意:给出一棵树,有\(M\)个人在这棵树上跑步.每个人都从自己的起点\(s[i]\)跑到终点\(t[i]\),跑过一条边的时间为1秒.现在每 ...