[2019HDU多校第二场][HDU 6591][A. Another Chess Problem]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6591
题目大意:二维坐标系上,所有满足\(5|2x+y\)的点都被设为障碍物,无法通过。现给出一对点,问从其中一点走到另一点的最少移动次数以及对应的方案数(每次可以移动一个单位长度)
题解:首先把图画出来,是长这样的

图中所有不能被走过的点用红点表示。可以发现(这个是五子棋中的八卦阵)这些点将图中的格点分成了若干个小块(图中用蓝色方块标出),每个小块里四个点保证两两之间的距离不会被红点所影响。于是我们可以考虑将点与所在的块对应起来,将点之间的移动转换为块之间的移动计算答案。
本人在这题中是将每个方块下方的红点作为该块对应的点,并以点\((2,1)\)当做新坐标系下的\((1,0)\)来进行坐标系的转化,而在块中,可以设每个方块的左上角为点\(0\),顺时针依次设为\(1,2,3\),这样方便之后计算在同一块内进行移动的答案。
转换完坐标系后,对于块间的移动,就可以看成求我要移动\(n\)行,\(m\)列的方案数。这里由于\(n,m\)可能为负数,于是可以考虑将他们全部转换为正数之后再做,转换的方法有很多,其中一种方法是:先判断\(n\)的正负,如果为负可以交换起点和终点,这样答案是一样的,之后判断\(m\)的正负,如果为负则可以做一个对称变换,将\(m\)改为正数,这里要注意点在块内的位置也可能会发生改变。
然后我们会发现,如果我们连续往一个方向移动,移动的步数会比交错方向要多,因此我们要尽量减少连续往相同方向移动的次数,这个最少的次数是可以计算出来的,假设其为\(t\),那么方案数就要乘上\(2^t\),这是因为连续往一个方向走的时候,必须要在块内走对角线,因此每次会有两种走法。另外我们还要考虑在不同位置改变移动方向的方案数,这个是可以用组合数来计算的,之后我们就只需要枚举从起点块的哪一点出发以及到达终点块时处于哪一个点即可。
#include<bits/stdc++.h>
using namespace std;
#define N 200001
#define LL long long
#define MOD 998244353
int T,n,m,ans,num,f[N],p[N],q[N],dis[][];
struct Point
{
int x,y,o;
void read(){scanf("%d%d",&x,&y);}
void get()
{
int tmp=((*x+y)%+)%;
if(tmp==)o=,y-=;
else if(tmp==)o=,x--,y-=;
else if(tmp==)o=,x--,y--;
else if(tmp==)o=,y--;
else while(true);
int tmpx=(*x+y)/,tmpy=(*y-x)/;
x=tmpx,y=tmpy;
}
}A,B;
void pretype()
{
f[]=;
p[]=q[]=;
f[]=p[]=q[]=;
for(int i=;i<N;i++)
{
f[i]=2ll*f[i-]%MOD;
p[i]=1ll*p[i-]*i%MOD;
q[i]=1ll*(MOD-MOD/i)*q[MOD%i]%MOD;
}
for(int i=;i<N;i++)
q[i]=1ll*q[i-]*q[i]%MOD;
for(int i=;i<;i++)
for(int j=;j<;j++)
dis[i][j]=min(abs(i-j),-abs(i-j));
}
int C(int n,int m){return 1ll*p[n]*q[m]%MOD*q[n-m]%MOD;}
void rua(int o1,int o2,int n,int m)
{
int w[]={n,m};
int res=,tot=,t;
if(w[o1]< || w[o2]<)return;
if(o1==o2 && w[o1]< && n+m>)return;
res=(n+m)*-;
if(n+m>)
{
w[o1]--,w[o2]--;
if(o1==o2)
{
t=abs(w[o1]+-w[o1^]);
res+=t,tot=f[t];
if(w[o1]+>=w[o1^])
tot=1ll*tot*C(w[o1]+,w[o1^])%MOD;
else tot=1ll*tot*C(w[o1^]-,w[o1])%MOD;
}
else
{
t=abs(w[o1]-w[o2]);
res+=t,tot=f[t];
if(w[o1]>=w[o2])
tot=1ll*tot*C(w[o1],w[o2])%MOD;
else tot=1ll*tot*C(w[o2],w[o1])%MOD;
}
}
t=dis[o1][A.o];
res+=t;if(t>)tot=2ll*tot%MOD;
t=dis[o2+][B.o];
res+=t;if(t>)tot=2ll*tot%MOD;
if(res==ans)num=(num+tot)%MOD;
if(res<ans)ans=res,num=tot;
}
int main()
{
pretype();
scanf("%d",&T);
while(T--)
{
A.read(),A.get();
B.read(),B.get();
n=B.y-A.y,m=B.x-A.x;
if(n== && m==)
{
ans=dis[A.o][B.o];
num=ans>?:;
printf("%d %d\n",ans,num);
continue;
}
if(n< || (n== && m<))
swap(A,B),n=-n,m=-m;
if(m<)A.o=(-A.o)%,B.o=(-B.o)%,m=-m;
ans=,num=;
for(int i=;i<;i++)
for(int j=;j<;j++)
rua(i,j-,n,m);
printf("%d %d\n",ans,num);
}
}
[2019HDU多校第二场][HDU 6591][A. Another Chess Problem]的更多相关文章
- [2019HDU多校第一场][HDU 6578][A. Blank]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题目大意:长度为\(n\)的数组要求分别填入\(\{0,1,2,3\}\)四个数中的任意一个,有 ...
- [2019HDU多校第一场][HDU 6580][C. Milk]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6580 题目大意:\(n\times m\)大小的方格上有\(k\)瓶水,喝完每瓶水都需要一定的时间.初 ...
- [2019HDU多校第一场][HDU 6584][G. Meteor]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6584 题目大意:求所有满足\(0<\frac{p}{q}\leq1, gcd(p,q)=1,p\ ...
- [2019HDU多校第一场][HDU 6590][M. Code]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6590 题目大意(来自队友):二维平面上有\(n\)个点,每个点要么是黑色要么是白色,问能否找到一条直线 ...
- [2019HDU多校第一场][HDU 6588][K. Function]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6588 题目大意:求\(\sum_{i=1}^{n}gcd(\left \lfloor \sqrt[3] ...
- 杭电多校第二场 hdu 6315 Naive Operations 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- 2019HDU多校第一场1001 BLANK (DP)(HDU6578)
2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 2014多校第二场1011 || HDU 4882 ZCC Loves Codefires (贪心)
题目链接 题意 : 给出n个问题,每个问题有两个参数,一个ei(所要耗费的时间),一个ki(能得到的score).每道问题需要耗费:(当前耗费的时间)*ki,问怎样组合问题的处理顺序可以使得耗费达到最 ...
随机推荐
- java源码 -- AbstractMap
AbstractMap抽象类实现了一些简单且通用的方法,本身并不难.但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以值的学习. 抽象类通常作为一种骨架实现,为各自子 ...
- @ConfigurationProperties和@Value的区别
@ConfigurationProperties @Value 功能: 批量注入配置文件中的属性 一个个指定,多个属性多个@Value 松散绑定: 支持 不支持 SpEL: 不支持 支持 JSR ...
- LC 3. Longest Substring Without Repeating Characters
题目描述 Given a string, find the length of the longest substring without repeating characters. Example ...
- golang字符串常用的系统函数
1.统计字符串的长度,按字节len(str) str := "hello北京" fmt.Println("str len=", len(str)) 2.字符串遍 ...
- 前端移动端的rem适配计算原理
rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem大家一定会想起em单位,em(font si ...
- mysql常见内置函数
在mysql中有许多内置的函数,虽然功能都能在PHP代码中实现,但巧妙的应用mysql内置函数可以大大的简化开发过程,提高效率. 在这里我总结一下一些常用的,方便以后查看: mysql字符串函数: c ...
- 16-MySQL DBA笔记-调优基础理论和工具
第五部分 性能调优与架构篇 本篇将为读者介绍性能调优的一些背景知识和理论,然后介绍一些工具的运用,最后介绍从应用程序到操作系统.到数据库.到存储各个环节的优化. 性能调优是一个高度专业的领域,它需要一 ...
- [jquery]ajax最最常用的七个属性
1.url 类型:String 默认值: 当前页地址.发送请求的地址. 2.data 类型:String 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 pr ...
- 初试Maven
1 [检查]确认已经安装jdk,已经环境变量中配置JAVA_HOME,已经修改Path 2 [下载]从http://maven.apache.org/download.cgi下载所需要的版本,笔者使用 ...
- XML-RPC-3XML-RPC 与 XML-RPC 服务器类
http://codeigniter.org.cn/user_guide/libraries/xmlrpc.html XML-RPC 与 XML-RPC 服务器类 CodeIgniter 的 XML- ...