题目链接: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]的更多相关文章

  1. [2019HDU多校第一场][HDU 6578][A. Blank]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题目大意:长度为\(n\)的数组要求分别填入\(\{0,1,2,3\}\)四个数中的任意一个,有 ...

  2. [2019HDU多校第一场][HDU 6580][C. Milk]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6580 题目大意:\(n\times m\)大小的方格上有\(k\)瓶水,喝完每瓶水都需要一定的时间.初 ...

  3. [2019HDU多校第一场][HDU 6584][G. Meteor]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6584 题目大意:求所有满足\(0<\frac{p}{q}\leq1, gcd(p,q)=1,p\ ...

  4. [2019HDU多校第一场][HDU 6590][M. Code]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6590 题目大意(来自队友):二维平面上有\(n\)个点,每个点要么是黑色要么是白色,问能否找到一条直线 ...

  5. [2019HDU多校第一场][HDU 6588][K. Function]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6588 题目大意:求\(\sum_{i=1}^{n}gcd(\left \lfloor \sqrt[3] ...

  6. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  7. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...

  8. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  9. 2014多校第二场1011 || HDU 4882 ZCC Loves Codefires (贪心)

    题目链接 题意 : 给出n个问题,每个问题有两个参数,一个ei(所要耗费的时间),一个ki(能得到的score).每道问题需要耗费:(当前耗费的时间)*ki,问怎样组合问题的处理顺序可以使得耗费达到最 ...

随机推荐

  1. DRF图片路径问题的解决方法,网上爬取的图片放到ImageFiled自动带上域名

    由于博客园不支持markdown,推荐下面的url访问 原创url: https://blog.csdn.net/weixin_42495873/article/details/89440437 - ...

  2. MySQL 数据库连接命令

    启动数据库服务 格式: net   start    数据库名 net start  mysql57 关闭数据库服务 格式: net   stop   数据库名 net stop mysql57 链接 ...

  3. RabbitMq的环境安装

    1.如图第一个是erlang语言的安装包,第二个是rabbitmq的安装包. 2.配置erlang语言环境,因为rabbitmq由erlang语言编写的,所以需要配置erlng语言环境. erlang ...

  4. (四)spring+servlet 整合

    一.Spring与Servlet的整合 1.1: 加入Spring的jar包.(要加web.jar包) 1.2: java工程中获取Spring的上下文对象. ApplicationContext c ...

  5. 【es6】es6使用集锦

    一.查找数组中是否包含某个元素  使用includes  ,返回值为布尔值 arr.includes(searchElement, fromIndex): 解析:searchElement   查询元 ...

  6. Mediawiki 子页链接无效的问题

    添加下面的配置到 LocalSettings.php 中即可: # Enable subpages in the main namespace $wgNamespacesWithSubpages[NS ...

  7. JS实现当前选择日期是星期几

    使用到的日期插件是My97 Datepicker,这里通过onpicked方法触发getDay()方法,在getDay()方法中获取已选择的日期来判断是星期几. 插件下载地址:http://www.m ...

  8. document对象详解

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  9. SublimeText 3 常见快捷键

      ·F12 跳转至预定义 ·F11 全屏模式 ·Ctrl+A 本文全选 ·Ctrl+F 打开底部搜索框,查找关键字. ·Ctrl+D 本文件选中光标选中的单词 ·Ctrl+L 选中光标所在一行 ·C ...

  10. stm32 SysTick系统定时器

    它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取 当定时器计数到0时,将从LOAD 寄存器 ...