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. Python实现商城购物经典案例

    代码分步骤思路: 商城添加商品:opea_db = [{'store_name': '手机','num': 1}] while True: store_name=input('请输入需要存放的商品(按 ...

  2. GitHub Deskhub使用

    (适合已经知道git是啥但是还不太熟到同学看-) GitHub deskhub就是一个图形化的github管理工具啦,比起来命令行使用舒服100倍哈哈哈- 链接:https://desktop.git ...

  3. Java日志框架的依赖设置备查(SLF4J, Log4j, Logback)

    前言 最近在看代码的过程中,发现身边的许多人在使用Java日志框架时,对于应该引入何种依赖不甚了解,搜索网络上的文章,常常也是互不一致.这篇文章可以看着是Java日志框架的入门使用和实践建议,重点介绍 ...

  4. XV6中的锁:MIT6.s081/6.828 lectrue10:Locking 以及 Lab8 locks Part1 心得

    这节课程的内容是锁(本节只讨论最基础的锁).其实锁本身就是一个很简单的概念,这里的简单包括 3 点: 概念简单,和实际生活中的锁可以类比,不像学习虚拟内存时,现实世界中几乎没有可以类比的对象,所以即使 ...

  5. Gradle 设置全局镜像源

    复制 init.gradle.kts 文件到 Windows 的 %USERPROFILE%/.gradle 或者 Linux 的 ~/.gradle 目录下.也可以直接复制文末的代码为 init.g ...

  6. # 简明快速配置 Rust 工具链

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/dBzL9WZ8P1L1X9j_XkmNQg 你可能会为不同版本的工具 ...

  7. 详解RecyclerView的预布局

    概述 RecyclerView 的预布局用于 Item 动画中,也叫做预测动画.其用于当 Item 项进行变化时执行的一次布局过程(如添加或删除 Item 项),使 ItemAnimator 体验更加 ...

  8. ASP.NET 6启动时自动创建MongoDB索引

    大家好,我是Edison. 最近,在使用MongoDB时,碰到这样的一个需求:针对某个Collection手动在开发环境创建了索引,但在测试环境和生产环境不想再手动操作了,于是就想着通过代码的方式在A ...

  9. CCF PTA编程培训师资认证

    考试费用: 双会员500元,任意一方单会员750元,报名考试同时成为CCF专业会员850元,非会员1000元. P/T2补考费用:双会员200元,任意一方单会员300元,非会员400元. T1补考费用 ...

  10. 如何调用Metabase开放API

    简介: Metabase是什么? 在传统企业的数据可视化业务中,通常需要从需求到审批,再到安排开发人员和排期,还要开发人员撰写代码最后再做导出.流程繁琐,参与的人员也多,往往需要几天甚至几周的时间! ...