Problem Statement

Takahashi is at the origin of a two-dimensional plane.

Takahashi will repeat teleporting $N$ times. In each teleportation, he makes one of the following moves:

  • Move from the current coordinates $(x,y)$ to $(x+A,y+B)$
  • Move from the current coordinates $(x,y)$ to $(x+C,y+D)$
  • Move from the current coordinates $(x,y)$ to $(x+E,y+F)$

There are obstacles on $M$ points $(X_1,Y_1),\ldots,(X_M,Y_M)$ on the plane; he cannot teleport to these coordinates.

How many paths are there resulting from the $N$ teleportations? Find the count modulo $998244353$.

Constraints

  • $1 \leq N \leq 300$
  • $0 \leq M \leq 10^5$
  • $-10^9 \leq A,B,C,D,E,F \leq 10^9$
  • $(A,B)$, $(C,D)$, and $(E,F)$ are distinct.
  • $-10^9 \leq X_i,Y_i \leq 10^9$
  • $(X_i,Y_i)\neq(0,0)$
  • $(X_i,Y_i)$ are distinct.
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

$N$ $M$
$A$ $B$ $C$ $D$ $E$ $F$
$X_1$ $Y_1$
$X_2$ $Y_2$
$\vdots$
$X_M$ $Y_M$

Output

Print the answer.


Sample Input 1

2 2
1 1 1 2 1 3
1 2
2 2

Sample Output 1

5

The following $5$ paths are possible:

  • $(0,0)\to(1,1)\to(2,3)$
  • $(0,0)\to(1,1)\to(2,4)$
  • $(0,0)\to(1,3)\to(2,4)$
  • $(0,0)\to(1,3)\to(2,5)$
  • $(0,0)\to(1,3)\to(2,6)$

Sample Input 2

10 3
-1000000000 -1000000000 1000000000 1000000000 -1000000000 1000000000
-1000000000 -1000000000
1000000000 1000000000
-1000000000 1000000000

Sample Output 2

0

Sample Input 3

300 0
0 0 1 0 0 1

Sample Output 3

292172978

有三种步伐,发现我们在坐标系上很难 dp。因为只有三种移动方式,所以我们考虑 dp 每种操作了多少次。

为了 \(O(1)\) 判断,我们可以把所有不能走的坐标用哈希表存起来。

定义 \(dp_{i,j,k}\) 为第一中移动方式移动了 \(i\) 次,第二种移动方式移动了 \(j\) 次第三种移动方式移动了 \(k\) 次的情况下,有多少种方案。

首先在哈希表上查一下这样子到达的点是否可以走,如果可以走,\(dp_{i,j,k}=dp_{i-1,j,k}+dp_{i,j-1,k}+dp_{i,j,k-1}\)

#include<cstdio>
const int N=305,S=2e9+1,P=998244353,mod=1e7+3;
typedef long long LL;
int n,m,a,b,c,d,e,f,dp[N][N][N];
LL hs[mod],ans,x,y;
LL hsh(int x,int y)
{
return 1LL*(x+S-1)*S+y+S;
}
void insert(LL a)
{
for(int i=a%mod;;i++)
{
if(i==mod)
i=0;
if(!hs[i])
{
hs[i]=a;
break;
}
}
}
int find(LL a)
{
for(int i=a%mod;;i++)
{
if(i==mod)
i=0;
if(!hs[i])
return 0;
if(hs[i]==a)
return 1;
}
}
LL tx(int x,int y,int z)
{
return 1LL*x*a+1LL*y*c+1LL*z*e;
}
LL ty(int x,int y,int z)
{
return 1LL*x*b+1LL*y*d+1LL*z*f;
}
int main()
{
scanf("%d%d%d%d%d%d%d%d",&n,&m,&a,&b,&c,&d,&e,&f);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
insert(hsh(x,y));
}
dp[0][0][0]=1;
for(int i=0;i<=n;i++)
{
for(int j=0;j+i<=n;j++)
{
for(int k=0;k+j+i<=n;k++)
{
x=tx(i,j,k),y=ty(i,j,k);
if(x<-1e9||x>1e9||y<-1e9||y>1e9||!find(hsh(x,y)))
{
if(i)
dp[i][j][k]=dp[i-1][j][k];
if(j)
dp[i][j][k]=(dp[i][j][k]+dp[i][j-1][k])%P;
if(k)
dp[i][j][k]=(dp[i][j][k]+dp[i][j][k-1])%P;
}
if(i+j+k==n)
ans=(ans+dp[i][j][k])%P;
// printf("%lld %lld %d %d %d %d\n",x,y,i,j,k,dp[i][j][k]);
}
}
}
printf("%d",ans);
return 0;
}

[ABC265E] Warp的更多相关文章

  1. CUDA2.1-原理之索引与warp

    本小节来自<大规模并行处理器编程实战>第四节,该书是很好的从内部原理结构上来讲述了CUDA的,对于理解CUDA很有帮助,借以博客的形式去繁取间,肯定会加入自己个人理解,所以有错误之处还望指 ...

  2. Warp divergence

    Threads are executed in warps of 32, with all threads in the warp executing the same instruction at ...

  3. CUDA ---- Warp解析

    Warp 逻辑上,所有thread是并行的,但是,从硬件的角度来说,实际上并不是所有的thread能够在同一时刻执行,接下来我们将解释有关warp的一些本质. Warps and Thread Blo ...

  4. CUDA性能优化----warp深度解析

    本文转自:http://blog.163.com/wujiaxing009@126/blog/static/71988399201701224540201/ 1.引言 CUDA性能优化----sp, ...

  5. Curved UI - VR Ready Solution To Bend Warp Your Canvas 1.7,1.8,2.2,2.3 四种版本压缩包(Unity UGUI曲面插件),可以兼容VRTK

    Curved UI - VR Ready Solution To Bend Warp Your Canvas 1.7,1.8,2.2,2.3 四种版本压缩包(Unity UGUI曲面插件) 可以兼容V ...

  6. 【并行计算-CUDA开发】CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起

    掌握部分硬件知识,有助于程序员编写更好的CUDA程序,提升CUDA程序性能,本文目的是理清sp,sm,thread,block,grid,warp之间的关系.由于作者能力有限,难免有疏漏,恳请读者批评 ...

  7. 【并行计算-CUDA开发】CUDA ---- Warp解析

    Warp 逻辑上,所有thread是并行的,但是,从硬件的角度来说,实际上并不是所有的thread能够在同一时刻执行,接下来我们将解释有关warp的一些本质. Warps and Thread Blo ...

  8. 【并行计算-CUDA开发】warp是调度和执行的基本单位而harf-warp为存储器操作基本单位

    1.在用vs运行cuda的一些例子时,在编译阶段会报出很多警告: warning C4819 ...... 解决这个警告的方法是打开出现warning的文件,Ctrl+A全选,然后在文件菜单:file ...

  9. CUDA01 - 硬件架构、warp调度、指令流水线和cuda并发流

    这一部分打算从头记录一下CUDA的编程方法和一些物理架构上的特点:从硬件入手,写一下包括线程束的划分.流水线的调度等等微结构的问题,以及这些物理设备是如何与软件对应的.下一部分会写一下cuda中的几种 ...

  10. 还在玩传统终端,不妨来试试全新 AI 终端 Warp

    壹 ❀ 引 最近一段时间,AI领域如同雨后春笋般开始猛烈生长,processon,sentry,一些日常使用的工具都在积极接入AI,那么正好借着AI的风头,今天给大家推荐一款非常不错的智能终端 war ...

随机推荐

  1. 微服务集成redis并通过redis实现排行榜的功能

    默认你已经看过我之前的教程了,并且拥有上个教程完成的项目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html 由于redis的安装网上教程很 ...

  2. 12、Spring之基于xml的AOP

    阅读本文前,建议先阅读Spring之基于注解的AOP 12.1.环境搭建 创建名为spring_aop_xml的新module,过程参考9.1节 12.1.1.配置打包方式和依赖 <?xml v ...

  3. ATtiny88初体验(三):串口

    ATtiny88初体验(三):串口 ATtiny88单片机不包含串口模块,因此只能使用软件方式模拟串口时序. 串口通信时序通常由起始位.数据位.校验位和停止位四个部分组成,常见的配置为1位起始位.8位 ...

  4. 【测试】自定义配置 RocksDB 进行 YCSB 测试

    目录 简介 编译 RocksDB 编译 YCSB 修复报错 自定义配置 RocksDB 进行 YCSB 测试 参考资料 本文主要记录在利用 YCSB 使用配置文件测试 RocksDB 的过程中遇到的一 ...

  5. 想让你的工作轻松高效吗?揭秘Java + React导出Excel/PDF的绝妙技巧!

    前言 在B/S架构中,服务端导出是一种高效的方式.它将导出的逻辑放在服务端,前端仅需发起请求即可.通过在服务端完成导出后,前端再下载文件完成整个导出过程.服务端导出具有许多优点,如数据安全.适用于大规 ...

  6. MySQL数据库触发器讲解 [创建/删除/查询/select into]

    刚学习实例完mysql触发器, 前来分享学习经验.    菜鸟装逼,  老鸟勿喷 先来认识一下有关触发器的一些关键词.  在使用触发器时, 这些关键词将被用到, 请记下它们的模样和用途(意思) cre ...

  7. 4399 Flash游戏专用浏览器, 无需安装Flash插件

    目前所有的主流浏览器都已经不再支持Flash了,即使有一些国内浏览器还支持flash,但只能安装国内特供版Flash Player. 但问题的关键在于,这个国内特供版跟 Adobe 海外发行的版本是两 ...

  8. C++算法之旅、09 力扣篇 | 常见面试笔试题(上)算法小白专用

    刷题的目的是为了更好的理解数据结构与算法,更好的理解一些封装起来的库函数是怎么实现的,而不是简简单单的为了刷题而刷题. 时间.空间复杂度 事后统计法 提前写好算法代码和编好测试数据,在计算机上跑,通过 ...

  9. IDEA工具第一篇:细节使用-习惯设置

    安装好Idea后,直接上手clone代码进入编码时代,有没有那么一刻你会觉用起来没有那么顺手流畅呢? 下面是关于 [Windows] 下安装idea的一些习惯设置[ Mac大致一样 ] 一.修改系统文 ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (111)-- 算法导论10.2 2题

    二.用go语言,用一个单链表 L实现一个栈.要求操作 PUSH和 POP 的运行时间仍为 O(1). 文心一言: 在 Go 语言中,我们可以用结构体来实现一个单链表,然后再用栈的相关操作. 以下是一个 ...