[THUPC2019]过河卒二(组合数学,容斥原理)
以后都懒得写题目大意和数据范围了。
hz学长的题其实也不那么毒瘤吗。比CDW的好多了
先考虑没有障碍怎么做。
首先发现,答案相当于一个左下角是 $(1,1)$,右上角是 $(n+1,m+1)$ 的棋盘,从 $(1,1)$ 走到 $(n+1,m+1)$ 的方案数。因为走到最上或最右就只有一种选法了。
枚举斜着走的次数 $i$。答案是 $\sum\limits_{i=0}^{\min(n,m)}\dbinom{n+m-i}{i}\dbinom{n+m-2i}{n-i}$。前面是选哪几步,后面是经典过河卒。(注意 $n,m$ 是 $x2-x1$ 和 $y2-y1$)
现在考虑有障碍。明显容斥。
令 $g[S]$ 表示至少经过 $S$ 中障碍的方案数。(可能经过更多的障碍)
答案是 $\sum\limits_Sg[S](-1)^{|S|}$。
如何计算 $g[S]$?
先把障碍按 $x$ 为第一关键字排序,按 $y$ 为第二关键字排序。
那么 $S$ 中如果存在 $i<j,y[i]>y[j]$ 那么为 $0$。
否则就是从起点到第一个点的方案数,从第一个点到第二个点的方案数……从最后一个点到终点的方案数的乘积。
时间复杂度看起来是 $O(2^k\min(n,m))$。
但是我们发现很多个方案数是被重复计算的。如果我们预处理两两点之间的方案数就能做到 $O(2^kk+k^2\min(n,m))$。
模数是质数,可以用卢卡斯定理。
#include<bits/stdc++.h>
using namespace std;
const int mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
struct pos{
int x,y;
bool operator<(const pos &p)const{
if(x!=p.x) return x<p.x;
return y<p.y;
}
}p[];
int n,m,k,x[],y[],cnt[][],fac[mod],inv[mod],invfac[mod],ans,sz[],in[],out[];
void init(){
fac[]=fac[]=inv[]=invfac[]=invfac[]=;
FOR(i,,mod-){
fac[i]=1ll*fac[i-]*i%mod;
inv[i]=mod-1ll*(mod/i)*inv[mod%i]%mod;
invfac[i]=1ll*invfac[i-]*inv[i]%mod;
}
}
int C(int n,int m){
if(n< || m< || n<m) return ;
return 1ll*fac[n]*invfac[m]%mod*invfac[n-m]%mod;
}
int lucas(int n,int m){
if(n<mod) return C(n,m);
return 1ll*lucas(n/mod,m/mod)*lucas(n%mod,m%mod)%mod;
}
int calc(int n,int m){
int ans=;
FOR(i,,min(n,m)) ans=(ans+1ll*lucas(n+m-i,i)*lucas(n+m-*i,n-i))%mod;
return ans;
}
int solve(int S){
int pre=-,ans=;
FOR(i,,k-) if((S>>i)&){
if(pre==-) ans=1ll*ans*in[i]%mod;
else{
if(y[pre]>y[i]) return ;
ans=1ll*ans*cnt[pre][i]%mod;
}
pre=i;
}
if(~pre) return 1ll*ans*out[pre]%mod;
else return calc(n,m);
}
int main(){
n=read();m=read();k=read();
init();
FOR(i,,k-) p[i].x=read(),p[i].y=read();
sort(p,p+k);
FOR(i,,k-) x[i]=p[i].x,y[i]=p[i].y;
FOR(i,,k-) FOR(j,i+,k-) cnt[i][j]=calc(x[j]-x[i],y[j]-y[i]);
FOR(i,,k-) in[i]=calc(x[i]-,y[i]-),out[i]=calc(n+-x[i],m+-y[i]);
FOR(i,,(<<k)-) sz[i]=sz[i>>]+(i&);
FOR(i,,(<<k)-){
if(sz[i]&) ans=(ans-solve(i)+mod)%mod;
else ans=(ans+solve(i))%mod;
}
printf("%d\n",ans);
}
[THUPC2019]过河卒二(组合数学,容斥原理)的更多相关文章
- LFYZ-OJ ID: 1020 过河卒(NOIP2002)
过河卒 Proble Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃 ...
- 洛谷[P1002]过河卒
原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...
- C语言程序设计100例之(20):过河卒
例20 过河卒 题目描述 如图1,在棋盘的A点有一个过河卒,需要走到目标B点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如图1的C点),该马所在的点和所有跳跃一步可达的点称 ...
- YCOJ过河卒C++
过河卒是一道~~较简单 的问题,用递归或者动态规划都可以完成,但今天主要不是递归或者动态规划,而是用深度优先搜索做的.虽然会有两组TLE~~ 深搜是一种向下搜索的算法(如图所示) 它能有效的统计中点到 ...
- 【9307】&【a303】过河卒(NOIP2002)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右. 同时在棋盘上的任一点有一个对方 ...
- AC日记——过河卒 洛谷 1002
题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...
- NOIP 2002过河卒 Label:dp
题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如 ...
- ACM题目————马拦过河卒
题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...
- wikioi 1010 过河卒
题目描述 Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点 ...
随机推荐
- github 白嫖记(一)
位运算 按位操作符:0或者1之间的运算 a|b 或 任意一个为1结果为1 console.log(0 | 1) //1 console.log(1 | 0) //1 console.log(1 | 1 ...
- Web应急:搜索引擎劫持
当你直接打开网址访问网站,是正常的,可是当你在搜索引擎结果页中打开网站时,会跳转到一些其他网站,比如博彩,虚假广告,淘宝搜索页面等.是的,你可能了遇到搜索引擎劫持. 现象描述 从搜索引擎来的流量自动跳 ...
- 【BZOJ4833】最小公倍佩尔数(min-max容斥)
[BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...
- 【问题记录】ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
一.问题描述 环境:MySQL 8.0 + Windows 由于密码错误或者其他原因导致无法连上MySQL服务,如下图: 二.解决方案 解决该问题的具体步骤如下: 1.关闭MySQL服务 以管理员权限 ...
- java 获取真实ip地址
/** * 获取真实ip地址 * @param request * @return */ public static String getIpAddress(HttpServletRequest re ...
- WPF ObservableCollection,INotifyPropertyChanged
xaml: <DockPanel Margin="10"> <StackPanel DockPanel.Dock="Rig ...
- windows 2012 IIS 部署 .net core HTTP Error 502.5 - Process Failure 错误解决办法
安装系统补丁: 2012 R2对应>Windows8.1-KB2999226-x64.msu 下载地址: https://www.microsoft.com/zh-CN/download/det ...
- java request.getInputStream中文乱码解决方案
请求时要指定为UTF-8,中文码码完美解决 /** * * 得到请求body字符串,一般用于content-type:application/json * */ public static Strin ...
- 隐马尔科夫模型(Hidden Markov Models) 系列之三
转自:http://blog.csdn.net/eaglex/article/details/6418219 隐马尔科夫模型(Hidden Markov Models) 定义 隐马尔科夫模型可以用一个 ...
- idea万能快捷键,不可不知的17个实用技巧
说明 IDEA里有一个万能快捷键(alt enter),功能非常强大,同一个快捷键,可以根据不同的语境提示你不同的操作,很多人可能还不了解这些功能,在处理代码的时候还手动处理,了解这些技巧之后,你编码 ...