博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gerald and Giant Chess
阅读量:4327 次
发布时间:2019-06-06

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

试题分析

我们发现普通$dp$时间复杂度为$O(h \times w)$的,会$T$的很惨。而这个又无法通过优化,所以呢就要改变$dp$策略。

观察到$n\leq 2000$,所以我们需要设计出一个关于不能走的$dp$。

part1 排列组合应用

$C_i^j$的意思大家都知道把,但是这道题又与排列组合有什么关系呢。易证$C_{n+m}^n$的结果正好是从$(0,0)$走到$(n,m)$的方案数,通过插板法可证。

所以若我们从$(1,1)$出发,到终点$(n,m)$的方案数为$C_{n+m-2}^{n-1}$。

part2 dp

所以说$dp$式子就很好写了,$f(i)$表示只经过$i$号黑点的方案数,其余黑点均不参加。同时将最后所要求的$(h,w)$当作一个黑点。

则:$f(i)={C_{x_i+y_i-2}^{x_i-1}}-f(j)\times C_{x_i-x_j+y_i-y_j}^{x_i-x_j}  (j点在i点的左上角)。$

然后再用逆元求一下即可。

#include
#include
#include
#include
#define int long long#define mod 1000000007using namespace std;inline int read(){ int f=1,ans=0;char c=getchar(); while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans;}const int N=200011;int inv[N],fac[N];int ksm(int a,int b){ int ans=1; while(b){ if(b&1) ans*=a,ans%=mod; a*=a,a%=mod; b>>=1; }return ans%mod;}int n,m,k;struct node{ int x,y;}a[N];int C(int m,int n){
if(n==0) return 1;return (fac[m]*((inv[n]*inv[m-n])%mod))%mod;}bool cmp(node x1,node x2){ if(x1.x==x2.x) return x1.y
a[i].x||a[j].y>a[i].y) continue; f[i]-=f[j]*C(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x); f[i]=((f[i]%mod)+mod)%mod; } } printf("%lld",(f[k]%mod+2*mod)%mod);}
View Code

 

转载于:https://www.cnblogs.com/si-rui-yang/p/10145555.html

你可能感兴趣的文章
RTMP
查看>>
求一个数的整数次方
查看>>
点云PCL中小细节
查看>>
铁路信号基础
查看>>
RobotFramework自动化2-自定义关键字
查看>>
[置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了
查看>>
BABOK - 需求分析(Requirements Analysis)概述
查看>>
第43条:掌握GCD及操作队列的使用时机
查看>>
Windows autoKeras的下载与安装连接
查看>>
CMU Bomblab 答案
查看>>
微信支付之异步通知签名错误
查看>>
2016 - 1 -17 GCD学习总结
查看>>
linux安装php-redis扩展(转)
查看>>
Vue集成微信开发趟坑:公众号以及JSSDK相关
查看>>
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>
P1313 计算系数
查看>>
NSString的长度比较方法(一)
查看>>
Azure云服务托管恶意软件
查看>>