题目当中有三条限制,我们来逐一考虑。对于第一条限制,每次走动的增加量 \(x_i \le M_x, y_i \le M_y\),可以发现一共走的步数是确定的,那么就相当于解这样两个方程组:

\[x_1 + x_2 + \cdots x_R = Tx
\]
\[y_1 + y_2 + \cdots y_R = Ty
\]

其中 \(x_i \le M_x, y_i \le M_y\),其实是两个独立的方程,最终解的数量实际上是上下两个方程解的数量相乘的结果,于是我们已第一个方程的解为例来思考。可以发现直接计算解的数量是不好算的,但钦定一些位置超过限制其他位置随意的方案是很好算的,于是我们可以令 \(f_i\) 表示钦定有 \(i\) 个位置不合法其他位置随意的方案,令 \(g_i\) 表示恰好有 \(i\) 个位置不合法的方案,那么有:

\[\begin{aligned}
f_i &= \dbinom{R}{i} \times \dbinom{Tx - (Mx + 1) \times i + R - 1}{R - 1}\\
&= \sum\limits_{j = i} ^ R \dbinom{j}{i} g_j
\end{aligned}
\]

根据二项式反演:

\[g_0 = \sum\limits_{i = 0} ^ R (-1) ^ i \dbinom{R}{i} \times \dbinom{Tx - (Mx + 1) \times i + R - 1}{R - 1}
\]

再来考虑第二个条件,不能出现任意一个位置使得 \(x_i = 0, y_i = 0\),同样我们发现还是可以使用二项式定理,令 \(f_i\) 表示钦定有 \(i\) 个位置 \(x_i = 0, y_i = 0\),其他位置随意且满足第一条限制的方案,\(g_i\) 为恰好的方案,那么有:

\[\begin{aligned}
f_i &= \dbinom{R}{i} \sum\limits_{i = 0} ^ {R - i} (-1) ^ i \dbinom{R - i}{i} \times \dbinom{Tx - (Mx + 1) \times i + R - i - 1}{R - i - 1}\\
&= \sum\limits_{j = i} ^ R \dbinom{j}{i} g_j
\end{aligned}
\]

根据二项式反演可得:

\[g_0 = \sum\limits_{i = 0} ^ R (-1) ^ i \dbinom{R}{i} \sum\limits_{i = 0} ^ {R - i} (-1) ^ i \dbinom{R - i}{i} \times \dbinom{Tx - (Mx + 1) \times i + R - i - 1}{R - i - 1}
\]

再来考虑第三条限制,同样可以使用二项式反演,只不过这里钦定的方案可能不是那么好算了。但是我们能发现钦定第三类不合法后这个位置将会被占用,那么我们可以一次考虑每条限制,那么一个 \(dp\) 就可以统计出这些方案,令 \(dp_{i, j, k}\) 表示当前考虑完前 \(i\) 种限制,当前已经钦定了 \(j\) 个位置,当前钦定位置上的增量之和为 \(k\) 的方案,那么同样我们枚举当前新哪增那些位置非法,有(令 \(a_i = k_i\)):

\[dp_{i, j, k} = \sum\limits_{l = 0} ^ {\min\{j, \frac{k}{a_i}\}} \dbinom{R - j + l}{l} dp_{i - 1, j - l, k - l \times a_i}
\]

但是这个 \(dp\) 的复杂度很高,因为第三维涉及到枚举走过的步数之和,但题目当中给了一个条件,所有限制的步数都是 \(G\) 的倍数,那么实际上我们只需要存储 \(k = \frac{k}{G}\) 即可,于是就可以将上面哪个 \(dp\) 的状态改写一下,转移基本没有变。可以发现这个 \(dp\) 第一维枚举的复杂度为 \(K\)(下面称其为 \(n\)),第二维的复杂度为 \(\min\{R, \frac{\min\{T_x, T_y\}}{G}\}\),第三维的枚举上限为 \(\frac{\min\{T_x, T_y\}}{G}\) 转移的复杂度也最多为 \(\frac{\min\{T_x, T_y\}}{G}\) 因此这个 \(dp\) 的复杂度是 \(O(n\min\{R, \frac{\min\{T_x, T_y\}}{G}\}(\frac{\min\{T_x, T_y\}}{G}) ^ 2) \le 50 \times 100 ^ 3 = 5 \times 10 ^ 7\)。

但是需要注意的是,我们最后二项式反演的时候,不能直接做两维的二项式反演,因为我们并不能保证那些恰好选择了 \(j\) 个位置非法的情况下有 \(i\) 个位置的增量之和为 \(k\)。因此,我们需要将所有钦定 \(i\) 个位置非法的方案相加再进行容斥。令 \(F_i\) 为钦定有 \(i\) 个位置非法的方案,那么有:

\[F_i = \sum\limits_{j = i} ^ {\frac{\min\{T_x, T_y\}}{G}} dp_{n, i, j} \times g_{R - i, j}
\]

其中 \(g_{i, j}\) 表示走 \(i\) 步,已经使用了 \(j \times G\) 步的满足前两条限制的方案。再令 \(f_{i, j}\) 表示走 \(i\) 步,已经使用了 \(j \times G\) 步的满足第一条限制的方案,则:

\[g_{i, j} = \sum\limits_{k = 0} ^ i (-1) ^ k \dbinom{i}{k} f_{i - k, j}
\]

可以发现有用的 \(f_{i, j}\) 只有 \(R \times \frac{\min\{T_x, T_y\}}{G}\) 个,每次计算需要 \(R\) 次,因此计算出所有可用的 \(f\) 总共的复杂度为 \(O(R ^ 2 \times \frac{\min\{T_x, T_y\}}{G})\) 还能承受。而可用的 \(g\) 也只有 \(R \times \frac{\min\{T_x, T_y\}}{G}\) 个,预处理出 \(f\) 后复杂度也可以做到 \(O(R ^ 2 \times \frac{\min\{T_x, T_y\}}{G})\)。最后总复杂度 \(O(R ^ 2 \times \frac{\min\{T_x, T_y\}}{G} + n \times (\frac{\min\{T_x, T_y\}}{G}) ^ 3)\) 可以通过本题。

一些坑点

  • 每次二项式反演一定要认真推式子,不然容易出错

  • \(f_0, g_0\) 的情况需要特判

  • 组合数的取值范围到 \(2 \times 10 ^ 6\)

  • 注意枚举 \(dp\) 时第二维和第三维的上限不同

#include<bits/stdc++.h>
using namespace std;
#define rep(i, l, r) for(int i = l; i <= r; ++i)
const int N = 1000000 + 5;
const int M = 100 + 5;
const int K = 1000 + 5;
const int Mod = 1000000000 + 7;
int n, R, G, L1, L2, tx, ty, Tx, Ty, Mx, My, ans;
int a[M], k[M], F[M], fac[N * 2], inv[N * 2], f[K][M], g[K][M], dp[M][M][M];
int read(){
char c; int x = 0, f = 1;
c = getchar();
while(c > '9' || c < '0'){ if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int Inc(int a, int b){
return (a += b) >= Mod ? a - Mod : a;
}
int Dec(int a, int b){
return (a -= b) < 0 ? a + Mod : a;
}
int Mul(int a, int b){
return 1ll * a * b % Mod;
}
int Qpow(int a, int b){
int ans = 1;
while(b){
if(b & 1) ans = Mul(ans, a);
a = Mul(a, a), b >>= 1;
}
return ans;
}
int C(int n, int m){
if(n < m) return 0;
return Mul(fac[n], Mul(inv[m], inv[n - m]));
}
int main(){
tx = read(), ty = read(), Mx = read(), My = read(), R = read(), G = read();
fac[0] = inv[0] = 1;
rep(i, 1, max(tx, ty) + R) fac[i] = Mul(fac[i - 1], i), inv[i] = Qpow(fac[i], Mod - 2);
n = read();
rep(i, 1, n) a[i] = read();
sort(a + 1, a + n + 1);
n = unique(a + 1, a + n + 1) - a - 1;
L2 = min(tx, ty) / G, L1 = min(R, L2);
if(tx == ty && (tx % G == 0)) f[0][tx / G] = 1;
rep(i, 1, R) rep(j, 0, L2){
int S1 = 0, S2 = 0; Tx = tx - j * G, Ty = ty - j * G; if(Tx < 0 || Ty < 0) continue;
rep(k, 0, i){
if(k & 1) S1 = Dec(S1, Mul(C(i, k), C(Tx - (Mx + 1) * k + i - 1, i - 1)));
else S1 = Inc(S1, Mul(C(i, k), C(Tx - (Mx + 1) * k + i - 1, i - 1)));
if(k & 1) S2 = Dec(S2, Mul(C(i, k), C(Ty - (My + 1) * k + i - 1, i - 1)));
else S2 = Inc(S2, Mul(C(i, k), C(Ty - (My + 1) * k + i - 1, i - 1)));
}
f[i][j] = Mul(S1, S2);
}
if(tx == ty && (tx % G == 0)) g[0][tx / G] = 1;
rep(i, 1, R) rep(j, 0, L2){
rep(k, 0, i){
if(k & 1) g[i][j] = Dec(g[i][j], Mul(C(i, k), f[i - k][j]));
else g[i][j] = Inc(g[i][j], Mul(C(i, k), f[i - k][j]));
}
}
dp[0][0][0] = 1;
rep(i, 1, n) rep(j, 0, L1) rep(k, j, L2) rep(l, 0, min(j, k * G / a[i])){
dp[i][j][k] = Inc(dp[i][j][k], Mul(C(R - j + l, l), dp[i - 1][j - l][k - l * (a[i] / G)]));
}
rep(i, 0, L1) rep(j, i, L2) F[i] = Inc(F[i], Mul(dp[n][i][j], g[R - i][j]));
rep(i, 0, L1) ans = ((i & 1) ? Dec(ans, F[i]) : Inc(ans, F[i]));
printf("%d", ans);
return 0;
}

「SDWC2018 Day1」网格的更多相关文章

  1. LOJ #6374「SDWC2018 Day1」网格

    模拟赛考过的题 当时太菜了现在也一样只拿到了$ 30$分 回来填个坑 LOJ #6374 题意 你要从$ (0,0)$走到$ (T_x,T_y)$,每次移动的坐标增量满足$ 0 \leq \Delta ...

  2. LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)

    LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...

  3. LOJ #6060. 「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    有趣的思博套路题,想到了基本上加上个对线性基的理解就可以过了 首先考虑到这个把数分成两半的分别异或的过程不会改变某一位上\(1\)的总个数 因此我们求出所有数的\(\operatorname{xor} ...

  4. 【LOJ6060】「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基)

    点此看题面 大致题意: 让你把\(n\)个数分成两部分,使得在两部分异或和之和最大的前提下,两个异或和中较小的那个尽量小.输出最优的较小异或和. 线性基 关于线性基,可以看一下这篇博客:线性基入门. ...

  5. 题解「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    题目传送门 题目大意 给出一个长度为 \(n\) 的数组,选出一些数异或之和为 \(s1\),其余数异或之和为 \(s2\),求 \(s1+s2\) 最大时 \(s1\) 的最小值. 思路 你发现如果 ...

  6. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  7. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  8. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

  9. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

随机推荐

  1. kafka2.x常用命令笔记(一)创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费

    接触kafka开发已经两年多,也看过关于kafka的一些书,但一直没有怎么对它做总结,借着最近正好在看<Apache Kafka实战>一书,同时自己又搭建了三台kafka服务器,正好可以做 ...

  2. element ui el-tree回显问题及提交问题(当后台返回的el-tree相关数组的时候,子菜单未全部选中,但是只要父级菜单的id在数组中,那么他的子菜单为全部选中状态)

    1:问题原因:我们可能使用 this.$refs.tree.setCheckedKeys(this.defalutArr);或者使用:default-expanded-keys="treeD ...

  3. [opencv]图像预处理方案及方式

    像识别中,图像质量的好坏直接影响识别算法的设计与效果精度,那么除了能在算法上的优化外,预处理技术在整个项目中占有很重要的因素,然而人们往往忽略这一点. 图像预处理,将每一个文字图像分检出来交给识别模块 ...

  4. Java初学者作业——编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,定义 Employee 类以及 HR 类,实现 HR 为 Employee 加薪的功能. 实现思路: 定义 Employee 类,并定义属性 ...

  5. Layui 的内置jquery 版本

    //layui-v2.4.5 的内置jquery 版本. console.log(layui.$.fn.jquery);//=> 1.12.3 可以使用内置jq的方法: 方法一: layui.u ...

  6. 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理。距离远时图片放大,距离近时图片缩小

    查看本章节 查看作业目录 需求说明: 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理.距离远时图片放大,距离近 ...

  7. MD5,SHA1及SHA256等哈希加密方法实现:Java,C#,Golang,Python

    哈希算法又称散列算法,它可以从任何数据中快速的创建一个凭证,而这个凭证很难被推倒出来,因为一丁点的变化会导致凭证的差别恨到,也就是说哈希算法具有不可逆性,因此它在密码数据校验方面用的很广,比如我们常用 ...

  8. Shelll1-基础入门之变量

    1.静态语言:编译型语言 强类型(变量) 事先转换成可执行格式 也就是先编译在执行 比如 C++.C. java C# 动态语言:解释性语言 弱类型 边解释边执行 比如PHP shell python ...

  9. Git Book PDF下载

    Download Git-Book

  10. HBase文档学习顺序

    1.<HBase基础概念知识学习> https://www.toutiao.com/i6774215329498268164/ 2.<VM安装CentOS6.5> https: ...