题目链接: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. LeNet-5 pytorch+torchvision+visdom

    # ====================LeNet-5_main.py=============== # pytorch+torchvision+visdom # -*- coding: utf- ...

  2. Jetbrains系列产品2019.2.3最新激活方法

    Jetbrains系列产品2019.2.3最新激活方法[持续更新] 发表于 2018-08-25 | 分类于 软件调试 本站惯例:本文假定你知道Jetbrains家的产品.不知道可以问问搜索引擎. 大 ...

  3. Ribbon【入门】

    公共依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...

  4. PostgreSql-psql命令的使用

    安装好postgresql后,将路径:安装路径\bin,添加到环境变量path中,这样才有了使用psql命令的前提. 使用psql命令时,不需要进入postgresql数据库,直接在命令行使用即可,若 ...

  5. 【C#】课堂知识点#1

    标准数字格式字符串 https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-string ...

  6. 解决IIS出现“由于权限不足而无法读取配置文件”的问题

    在部署IIS项目的时候,今天突然遇到了如下问题: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效 详细错误信息: 由于权限 ...

  7. IntelliJ IDEA 之 配置JDK 的 4种方式

    一.新建项目前配置JDK 打开IDEA集成开发环境工具,点击:File--Project Structure,如下图 在打开的页面中,选择SDKs属性,并点击中间的加号+,选择JDK,如下图 在打开的 ...

  8. maven项目打包和编译跳过单元测试和javadoc

    代码中可能由于单元测试.注释(方法中的参数)或者maven javadoc插件的问题导致无法打包,影响工作,为避免这两种情况可以在打包时输入命令: mvn clean install -Dmaven. ...

  9. bootstrap实现Carousel旋转木马(焦点图)

    引入bootstrap相关文件后,在html中写如下代码: <div class="col-lg-9" > <!-- Carousel============== ...

  10. 一步一步教你实现iOS音频频谱动画(二)

    如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第一篇:一步一步教你实现iOS音频频谱动画(一) 本文是系列文章中的第二篇,上篇讲述了音频播放和频谱数据计算,本篇讲 ...