博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[入门OJ3876]怎样学习哲学
阅读量:6950 次
发布时间:2019-06-27

本文共 1168 字,大约阅读时间需要 3 分钟。

题目大意:

  有一个$n\times m(n,m\leq 10^9)$的网格图,从一个点可以到下一行中列数比它大的点。有$k(k\leq 2000)$个点是不能走的,问从第$1$行到第$n$行共有几种方案。

思路:

  动态规划求出以点$i$为终点的方案数,直接$O(nm)$推显然会超时,因此我们$O(k)$可以对于每个障碍点求出组合数。组合数可以用Lucas定理求。
  Lucas定理:$\binom{n}{m}\mod p=\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{m}{p}\rfloor}\binom{n\mod p}{m\mod p}\mod p$。

1 #include
2 #include
3 #include
4 #include
5 typedef long long int64; 6 inline int getint() { 7 register char ch; 8 while(!isdigit(ch=getchar())); 9 register int x=ch^'0';10 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');11 return x;12 }13 const int mod=1000003,K=2001;14 int fact[mod],factinv[mod],f[K];15 std::pair
v[K];16 void exgcd(const int &a,const int &b,int &x,int &y) {17 if(!b) {18 x=1;19 y=0;20 return;21 }22 exgcd(b,a%b,y,x);23 y-=a/b*x;24 }25 inline int inv(const int &x) {26 int ret,tmp;27 exgcd(x,mod,ret,tmp);28 return (ret%mod+mod)%mod;29 }30 int lucas(const int &n,const int &m) {31 if(n

 

转载于:https://www.cnblogs.com/skylee03/p/8258092.html

你可能感兴趣的文章
leetcode539
查看>>
归并排序实现
查看>>
leetcode91
查看>>
Qt中实现菜单和工具栏功能
查看>>
java相关技术问答(二)
查看>>
网络攻防实验(二)——201521460003王浩洋
查看>>
简述DOM与BOM的区别
查看>>
OpenCV笔记(六)——随机数产生器、绘制文字
查看>>
量价齐扬喷发全面起涨
查看>>
云端汽车产业
查看>>
highchart 实现mrtg
查看>>
报告显示移动开发者更钟爱iOS平台
查看>>
NHibernate中使用NLog
查看>>
【转载四】Grafana系列教程–Grafana基本概念
查看>>
【小练习】“表单”制作及答案
查看>>
Android应用程序支持安装到SD卡
查看>>
我的软件工程课目标
查看>>
MYSQL 连接数据库命令收藏
查看>>
C#基础篇六飞行棋
查看>>
汇编语言(王爽)第一章基础知识
查看>>