题目
在三维空间内,你当前处于(0,0,0),需要走到(x,y,z)(-1e7<=x,y,z<=1e7)
每一步,你可以先选择三维中的某一维,然后令这一维+1或-1,其他两维保持不变,
换言之,每一步只能从当前整点移动到三维空间内相邻的整点,
求恰好n(n<=1e7)步走到(x,y,z)的方案数,答案对998244353取模
思路来源
dls的B站讲解
题解
首先,题目n=1e7,刻意卡了NTT,因为998244353=2^23*7*17,
即最大支持的NTT长度为2^23,再大下去变换会失真从而无法确定函数,
比如长度为2^24,则可能会出现两个位置分到同一个复根的情况,
当然,折半之后NTT再合并答案,可以强行卡过去
所以,考虑这题O(n)怎么做,
判完不合法之后,很容易想到枚举其中一维x,
从n步里选i步给x这维,求i步里走x的方案数,
剩下n-i步留给(y,z)这两维,求n-i步在一维走y另一维走z的方案数
在二维空间下,这是一个经典问题
考虑对二维空间(y,z)进行(-1,0)(0,-1)(1,0)(0,1)四种操作,
等价于对二维空间(y+z,y-z)进行(-1,-1)(-1,1)(1,1)(1,-1)四种操作,
原来的空间内只能对某一维+1或-1,
而在新的空间内两维的+1和-1互不影响,是独立的,
且两个空间是满射的,即一一映射,
新空间独立找出的方案,可以唯一映射回老空间内对应的方案
根据乘法原理,只需要分别求n-i步走y+z和y-z的方案数,相乘即可
代码
#include<bits/stdc++.h>
using namespace std;
const int mod=9982

本文介绍了一种在三维空间中,利用动态规划和NTT优化的方法,解决从原点到目标点(x,y,z)的最短步数问题。通过巧妙地转换空间和利用模运算技巧,将计算复杂度限制在O(n)内,并针对特定模数998244353进行了优化。核心内容包括二维空间的独立操作原理和代码实现。
最低0.47元/天 解锁文章
388

被折叠的 条评论
为什么被折叠?



