DYOJ 【20220317模拟赛】瞬间移动 题解
瞬间移动
题意
三维空间中从 \((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)\) 的方案数
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 \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+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\) 个的方案
第一个式子可以化成 \(\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}\) ,可得第二个式子。
第二个式子提出与 \(i\) 无关项得到第三个式子
第三个式子的 \(\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模拟赛】瞬间移动 题解的更多相关文章
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 2020.3.23 模拟赛游记 & 题解
这次的模拟赛,实在是水. 数据水,\(\texttt{std}\) 水,出题人水,做题人也水.??? 游记就说一句: 水. T1 metro 弱智题. 人均 \(100pts\). #pragma G ...
- 洛谷[LnOI2019]长脖子鹿省选模拟赛 简要题解
传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...
- NOIP模拟赛10 题解
t3: 题意 给你一棵树,然后每次两种操作:1.给一个节点染色 : 2. 查询一个节点与任意已染色节点 lca 的权值的最大值 分析 考虑一个节点被染色后的影响:令它的所有祖先节点(包括自身)的所有除 ...
- BJOI 模拟赛 #3 题解
T1 一个网格,每个点有权值,求有多少条路径权值乘积不小于 $n$ $R,C \leq 300, n \leq 10^6$ sol: 暴力 dp 是 $O(R \times C \times n)$ ...
- BJOI 2019 模拟赛 #2 题解
T1 完美塔防 有一些空地,一些障碍,一些炮台,一些反射镜 障碍会挡住炮台的炮, 反射镜可以 90° 反射炮台的光线,炮台可以选择打他所在的水平一条线或者竖直一条线 求是否有一组方案满足每个空地必须要 ...
- 【CYH-02】noip2018数论模拟赛:赛后题解
1.小奔的矩阵 2.大奔的方案 3.小奔与不等四边形 4.小奔的方案 当然本次比赛肯定难度不会仅限于此啦!后续还会--
- bsoj5988 [Achen模拟赛]期望 题解
bsoj5988 Description [题目背景] NOI2018 已经过去了许久,2019 届的 BSOIer 们退役的退役,颓废的颓废,计数能力大不如前.曾经的数数之王 xxyj 坦言:&qu ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
随机推荐
- 微信小程序支付框样式以及功能
1.页面代码 <view catchtap='showInputLayer' class="btn_pay">立即支付</view> <!-- 密码输 ...
- Promise原理实现(一):前置知识点
实现promise首先需要了解如下知识点: 1: 高阶函数 (一个函数作为另外一个函数的参数,这个包含的函数就是高阶函数): outer是一个高阶函数,inner函数作为一个参数传递:此处也是闭包 ...
- Mybatis实现多级菜单查询
写在前面 最近实现一个小需求,前端需要菜单的信息,需要向后端发起获取菜单的请求,菜单又是一个多级菜单,后端我用的mybatis进行数据库查询,实现的方法我这里想到有两种,欢迎大家补充. 1. 在Men ...
- .NET如何快速比较两个byte数组是否相等
目录 前言 评测方案 几种不同的方案 For循环 Memcmp 64字长优化 SIMD Sse Avx2 SequenceCompare 总结 参考文献 前言 之前在群里面有群友问过一个这样的问题,在 ...
- vivo 短视频推荐去重服务的设计实践
一.概述 1.1 业务背景 vivo短视频在视频推荐时需要对用户已经看过的视频进行过滤去重,避免给用户重复推荐同一个视频影响体验.在一次推荐请求处理流程中,会基于用户兴趣进行视频召回,大约召回2000 ...
- shiro+springboot分析思路
文章目录 前言 一.为什么要使用shiro 二.使用步骤 1.如何认证和授权 2.如何获取数据 总结 前言 shiro和spring security等安全框架可以用户管理和权限认证 一.为什么要使用 ...
- 小程序canvas 圆角框带填充颜色
// ctx: 获取canvas的id --- const ctx = wx.createCanvasContext('canvasId') // x 横坐标 y 纵左边 w 框的宽度 h 框的高 ...
- OpenHarmony 3.1 Beta版本关键特性解析——ArkUI容器类API介绍
(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 刘鑫 容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法.在 ArkUI 开发框 ...
- Go单体服务开发最佳实践
单体最佳实践的由来 对于很多初创公司来说,业务的早期我们更应该关注于业务价值的交付,并且此时用户体量也很小,QPS 也非常低,我们应该使用更简单的技术架构来加速业务价值的交付,此时单体的优势就体现出来 ...
- Mac 系统用mx master3遇到的问题
买 master3 之前上网看到的资料都是夸的不行,提到的问题也都是无足轻重,然而就我个人来说,在 Mac 下实际使用 master3 的感受很糟糕,写这篇文章分享一下遇到的问题,如果有想买的人看到这 ...