传送门: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)。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N=1e6+;
  5. struct node{ll x,y;}a[N];
  6. ll n,m,P,f[N],p[],fac[][N],inv[][N],mul[],imul[],g[];
  7. int num,tp;
  8. bool cmp(node a,node b){return a.x==b.x?a.y<b.y:a.x<b.x;}
  9. ll qpow(ll a,ll b,ll p)
  10. {
  11. ll ret=;
  12. while(b)
  13. {
  14. if(b&)ret=ret*a%p;
  15. a=a*a%p,b>>=;
  16. }
  17. return ret;
  18. }
  19. ll c(ll a,ll b,int i)
  20. {
  21. if(a<b)return ;
  22. if(a<p[i]&&b<p[i])return fac[i][a]*inv[i][b]%p[i]*inv[i][a-b]%p[i];
  23. return c(a%p[i],b%p[i],i)*c(a/p[i],b/p[i],i)%p[i];
  24. }
  25. ll C(ll a,ll b)
  26. {
  27. if(!tp)return c(a,b,);
  28. ll ret=;
  29. for(int i=;i<=;i++)g[i]=c(a,b,i);
  30. for(int i=;i<=;i++)ret=(ret+g[i]*mul[i]%P*imul[i]%P)%P;
  31. return ret;
  32. }
  33. int main()
  34. {
  35. scanf("%lld%lld%d%lld",&n,&m,&num,&P);
  36. for(int i=;i<=num;i++)scanf("%lld%lld",&a[i].x,&a[i].y);
  37. a[++num]=(node){n,m};
  38. sort(a+,a+num+,cmp);
  39. if(P==1e6+)p[]=1e6+;else p[]=,p[]=,p[]=,p[]=,tp=;
  40. if(tp)
  41. {
  42. for(int i=;i<=;i++)
  43. {
  44. mul[i]=P/p[i],imul[i]=qpow(mul[i],p[i]-,p[i]);
  45. fac[i][]=;for(int j=;j<p[i];j++)fac[i][j]=fac[i][j-]*j%p[i];
  46. inv[i][p[i]-]=qpow(fac[i][p[i]-],p[i]-,p[i]);
  47. for(int j=p[i]-;j;j--)inv[i][j-]=inv[i][j]*j%p[i];
  48. }
  49. }
  50. else{
  51. fac[][]=;for(int i=;i<P;i++)fac[][i]=fac[][i-]*i%P;
  52. inv[][P-]=qpow(fac[][P-],P-,P);
  53. for(int i=P-;i;i--)inv[][i-]=inv[][i]*i%P;
  54. }
  55. for(int i=;i<=num;i++)
  56. {
  57. f[i]=C(a[i].x+a[i].y,a[i].x);
  58. for(int j=;j<i;j++)if(a[j].x<=a[i].x&&a[j].y<=a[i].y)
  59. 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;
  60. }
  61. printf("%lld",f[num]);
  62. }

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. Codeforces 1154G Minimum Possible LCM

    题目链接:http://codeforces.com/problemset/problem/1154/G 题目大意: 给定n个数,在这些数中选2个数,使这两个数的最小公倍数最小,输出这两个数的下标(如 ...

  2. 如何建立一个WCF服务并将其发布到IIS上

    在我们的软件开发中,经常会连接到数据库中,如果是常规的操作,我们经常会将连接数据库的字符串写在配置文件中,然后去读取数据库的连接字符串,其实这种方式是非常不科学的,这会直接暴露我们的数据库,直接暴露我 ...

  3. idea使用破解版mybatis plugin插件失败,idea打不开的解决方案

    记一次错误解决方案 打开 idea.vmoptions (Help -> Edit Custom VM Options...) ,在这里进行了修改 加了破解jar包的路径,但是之前的路径中有中文 ...

  4. jqGrid选中行、格式化、自定义按钮、隐藏

    获取选择一行的id: var id=$('#jqGrid').jqGrid('getGridParam','selrow'); 获取选择多行的id: var ids=$('#jqGrid').jqGr ...

  5. Cherry.chen window.clipboardData实现剪切板操作总结 (好像只有ie好用)

    window.clipboardData的作用是在页面上将需要的东西复制到剪贴板上,提供了对于预定义的剪贴板格式的访问,以便在编辑操作中使用. 三个方法 (1)clearData(sDataForma ...

  6. SQL 给视图赋权限

    授予表权限 创建视图 授予视图权限 测试权限 复杂程度: 初级 数据要求: 使用自备的数据 您可以使用 SQL 在企业级地理数据库中创建表和要素类的视图. 本主题中的示例显示如何使用 Microsof ...

  7. css 媒体查询 注意点

    1, 媒体查询表达式之间还可以用逗号,@media (max-width:800px), print  它表示或的意思 @media (max-width: 800px) OR print; 2, n ...

  8. java基础之Number

    1.Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper ...

  9. docker之harbor仓库注意事项

    首先修改harbor的配置文件harbor.cfg hostname可以是ip也可以是主机名 修改docker/etc/docker/daemon.json 添加insecure-registries ...

  10. Codeforces Round #542 Div. 1

    A:显然对于起点相同的糖果,应该按终点距离从大到小运.排个序对每个起点取max即可.读题花了一年还wa一发,自闭了. #include<iostream> #include<cstd ...