瞬间移动

题意

三维空间中从 \((0,0,0)\) 开始,每次移动 1,问刚好走 \(N\) 次能到 \((X,Y,Z)\) 的方案数

\(N\le10^7\),答案模 \(998244353\)

Sol

一个感觉很简单的题,结果。。。

不失一般性地,设 \(x,y,z\ge0\)

显然当 \(x+y+z>n\) 或 \((n-x-y-z)\mod2=1\) 时答案为 0

先只考虑前两维,设 \(F_k\) 为从 \((0,0)\) 一共走 \(X+Y+2k\) 步到 \((X,Y)\) 的方案数

\[\begin{aligned}
F_k &= \sum_{i=0}^k
\begin{pmatrix} x+y+2k \\ x+i\quad i\quad y+k-i\quad k-i \end{pmatrix} \\
&= \sum_{i=0}^k \begin{pmatrix} x+y+2k \\ x+y+k \end{pmatrix}
\begin{pmatrix} x+y+k \\ y+k-i \end{pmatrix}\begin{pmatrix} k \\ i \end{pmatrix} \\
&= \begin{pmatrix} x+y+2k \\ x+y+k \end{pmatrix}\sum_{i=0}^k
\begin{pmatrix} x+y+k \\ y+k-i \end{pmatrix}\begin{pmatrix} k \\ i \end{pmatrix} \\
&= \begin{pmatrix} x+y+2k \\ x+y+k \end{pmatrix}
\begin{pmatrix} x+y+2k \\ y+k \end{pmatrix}
\end{aligned}
\]

解释

首先:

\[\begin{pmatrix} n\\ a\quad b\quad c \quad d \end{pmatrix}
= \begin{pmatrix} n\\a \end{pmatrix}\begin{pmatrix} n-a\\b \end{pmatrix}
\begin{pmatrix} n-a-b\\c \end{pmatrix}\begin{pmatrix} n-a-b-c\\d \end{pmatrix}
\]

先后顺序可以交换


其次:

\[\begin{pmatrix} n \\ m \end{pmatrix}\begin{pmatrix} n-m \\ r \end{pmatrix}
= \begin{pmatrix} n \\ m+r \end{pmatrix}\begin{pmatrix} m+r \\ r \end{pmatrix}
= \begin{pmatrix} n \\ m+r \end{pmatrix}\begin{pmatrix} m+r \\ m \end{pmatrix}
\]

从 \(n\) 个里面分别选出 \(m,r\) 个的方案数

等同于

先从 \(n\) 里面选出 \(m+r\) 个,其中再选出 \(m\) 或 \(r\) 个的方案


  1. 第一个式子可以化成 \(\begin{pmatrix} x+y+2k \\ x+i\quad y+k-i\end{pmatrix}\begin{pmatrix} k \\ i\quad k-i \end{pmatrix}\)

    前面那一部分化成 \(\begin{pmatrix} x+y+2k \\ x+y+k \end{pmatrix}
    \begin{pmatrix} x+y+k \\ y+k-i \end{pmatrix}\)

    后面化成 \(\begin{pmatrix} k \\ i \end{pmatrix}\) ,可得第二个式子。

  2. 第二个式子提出与 \(i\) 无关项得到第三个式子

  3. 第三个式子的 \(\sum_{i=0}^k
    \begin{pmatrix} x+y+k \\ y+k-i \end{pmatrix}\begin{pmatrix} k \\ i \end{pmatrix}\)

    其实就是从 \(x+y+2k\) 个球中选 \(y+k\) 个,枚举最后 \(k\) 个中选了多少个

    即 \(\begin{pmatrix} x+y+2k \\ y+k \end{pmatrix}\)

到三维

直接枚举 \(z\) 走的步数即可,复杂度 \(O(n)\)

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL P = 998244353;
const int N = 1e7 + 5;
inline LL Pow(LL x, LL y) {
register LL res = 1;
for (; y; y >>= 1, x = x * x % P)
if (y & 1) res = res * x % P;
return res;
}
LL fac[N], inv[N], res;
inline LL C(int n, int m) {
if (m > n) return 0;
return fac[n] * inv[m] % P * inv[n - m] % P;
}
int n, X, Y, Z, le, tt;
inline LL count(int k) {
return C(X + Y + 2 * k, X + Y + k) * C(X + Y + 2 * k, Y + k) % P;
}
int main() {
// freopen("teleport.in", "r", stdin);
// freopen("teleport.out", "w", stdout);
scanf("%d%d%d%d", &n, &X, &Y, &Z);
X = abs(X), Y = abs(Y), Z = abs(Z), le = X + Y + Z, fac[0] = 1;
if (n < le) return puts("0"), 0;
if ((n - le) & 1) return puts("0"), 0; for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % P;
inv[n] = Pow(fac[n], P - 2);
for (int i = n - 1; ~i; i--) inv[i] = inv[i + 1] * (i + 1) % P;
tt = (n - le) / 2;
for (int z = 0; z <= tt; z++)
(res += C(n, z) * C(n - z, Z + z) % P * count(tt - z) % P) %= P;
printf("%lld", res);
}

总结

这个式子就是经典的范德蒙德卷积。

高级的名字,本质是组合数的变换

以后遇到这种题要记得各种性质,大胆去推

DYOJ 【20220317模拟赛】瞬间移动 题解的更多相关文章

  1. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  2. 2020.3.23 模拟赛游记 & 题解

    这次的模拟赛,实在是水. 数据水,\(\texttt{std}\) 水,出题人水,做题人也水.??? 游记就说一句: 水. T1 metro 弱智题. 人均 \(100pts\). #pragma G ...

  3. 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解

    传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...

  4. NOIP模拟赛10 题解

    t3: 题意 给你一棵树,然后每次两种操作:1.给一个节点染色 : 2. 查询一个节点与任意已染色节点 lca 的权值的最大值 分析 考虑一个节点被染色后的影响:令它的所有祖先节点(包括自身)的所有除 ...

  5. BJOI 模拟赛 #3 题解

    T1 一个网格,每个点有权值,求有多少条路径权值乘积不小于 $n$ $R,C \leq 300, n \leq 10^6$ sol: 暴力 dp 是 $O(R \times C \times n)$ ...

  6. BJOI 2019 模拟赛 #2 题解

    T1 完美塔防 有一些空地,一些障碍,一些炮台,一些反射镜 障碍会挡住炮台的炮, 反射镜可以 90° 反射炮台的光线,炮台可以选择打他所在的水平一条线或者竖直一条线 求是否有一组方案满足每个空地必须要 ...

  7. 【CYH-02】noip2018数论模拟赛:赛后题解

    1.小奔的矩阵 2.大奔的方案 3.小奔与不等四边形 4.小奔的方案 当然本次比赛肯定难度不会仅限于此啦!后续还会--

  8. bsoj5988 [Achen模拟赛]期望 题解

    bsoj5988 Description [题目背景] NOI2018 已经过去了许久,2019 届的 BSOIer 们退役的退役,颓废的颓废,计数能力大不如前.曾经的数数之王 xxyj 坦言:&qu ...

  9. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

随机推荐

  1. vuecli中配置webpack加快打包速度

    webpack4中webpack 的DllPlugin插件可以将常见的库文件作为dll文件来,每次打包的时候就不用再次打包库文件了. 但是游鱼西在vuecli中已经去除这个选项,意识到带来的打包速度提 ...

  2. 微信小程序页面跳转参数传递

    可以使用标签直接传递 <navigator class="gotoDetail" target="self" url="../detail/de ...

  3. 引用nodejs的url模块实现url路由功能

    我们在本地创建服务器之后需要写不同的后缀名来访问同一个站点的不同页面,如果不实现路由功能.则每次访问localhost:3000 不论后面写什么  比如localhost:3000/index.loc ...

  4. Makefile 简介

    一.引例: #Makefile objects=test1.o test2.o main:$(objects) gcc -o main $(objects) clean: rm main $(obje ...

  5. Java基础之浅谈接口

    前言 前几篇文章我们已经把Java的封装.继承.多态学习完了,现在我们开始比较便于我们实际操作的学习,虽然它也是Java基础部分,但是其实入门容易,精通很难. 我认真的给大家整理了一下这些必须学会.了 ...

  6. victoriaMetrics之byteBuffer

    victoriaMetrics之byteBuffer VictoriaMetrics经常会处理数目庞大的指标,在处理的过程中会涉及指标的拷贝,如果在指标拷贝时都进行内存申请的话,其内存消耗和性能损耗都 ...

  7. 汇编语言实验1—Debug基础操作

    1.使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后CPU中相关寄存器中内容的变化. 记录1:最后一条指令执行完BX=(4026)H,AL=(66)H,检验结果. 两种写入:e命令 ...

  8. C语言基础部分练习(http://acm.hgnu.edu.cn)

    前言 最近有朋友和同学找我要c语言基础练习答案,为了方便分享,放在我的博客上了,如果对你确实有帮助,可以考虑点下赞或打赏哦(都能通过,没有专注于搞算法,所以有的地方可以优化,欢迎在评论区留言) A. ...

  9. 如何基于ZEGO SDK 实现通话质量监测

    如何基于ZEGO SDK 实现通话质量监测 1 功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 请参考 ...

  10. JVM组成、GC回收机制、算法、JVM常见启动参数、JAVA出现OOM,如何解决、tomcat优化方法

    JVM组成.GC回收机制.算法.JVM常见启动参数.JAVA出现OOM,如何解决.tomcat优化方法