\(\mathscr{Description}\)

  给定平面向量集 \(\newcommand{\vct}[1]{\boldsymbol{#1}}\{\vct v_n\}\),求从 \((0,0)\) 开始用这些向量作为方向画线段,求能画出的本质不同的封闭凸多边形,满足面积非 \(0\),且在 \(x\) 轴和 \(y\) 轴上的投影长度都不超过 \(m\)。答案对 \(998244353\) 取模。

  \(n\le 5\),向量集任意分量在 \([-4,4]\),\(m\le10^9\),此外所有数据都是整数。

\(\mathscr{Solution}\)

  出题人去为文惠君解牛吧!

  抽象一下要求,问题等价与求

\[\begin{cases}
\sum_i c_ix_i=0\\
\sum_i c_iy_i=0\\
\sum_{x_i>0} c_ix_i\le m\\
\sum_{y_i>0} c_iy_i\le m
\end{cases}
\]

中 \(\{c_n\}\) 的非负整数解数量。这什么玩意儿?类欧?半平面交?同余最短路?直接解离大谱了属于是。

  好,出题人开发了(或者搬运了)一个极其神奇的 trick:你不是要 \(\sum_ic_ix_i=0\) 吗?由于 \(x_i\) 很小,所以 每次加法对 bit 的改变有局限,那么,我们,数位 DP

  由于正负混杂不方便,我们记 \(\textit{pxs}\) 表示正的 \(x\) 之和,\(\textit{nxs}\) 表示负的 \(x\) 之和;\(\textit{pys}\) 和 \(\textit{nys}\) 同理。从这个基本事实入手:确定了 \(c\) 的所有最低位之后,四个值的奇偶性(最低位)是确定的。这意味这若现在就有 \(\textit{pxs}\) 和 \(\textit{nxs}\) 的最低位不同,那么不管 \(c\) 怎么取,\(\textit{pxs}\neq\textit{nxs}\),联系限制,这种情况可以舍弃。

  推而广之,确定了 \(c\) 的所有低 \(i\) 位之后,四个值的低 \(i\) 位也都是确定的。这个时候,对于前两个限制,只需要记录 \(\textit{pxs}\) 等值除掉低 \(i\) 位的数值即可进行后续判断;后两个限制直接维护低 \(i\) 位是否有 \(\sum_{x_i>0}c_i^{(0..i-1)}x_i\le m^{(0..i-1)}\) 以及 \(y\) 对应的式子即可。因此,我们得到这样一个状态:

  令 \(f(i,\textit{pxs},\textit{nxs},\textit{pys},\textit{nys},0/1,0/1)\) 表示考虑了 \(c\) 的低 \(i\) 位,取到了这四个值,分别是否 \(\le m^{(0..i-1)}\)。转移时,只需要确定所有 \(c\) 的第 \(i+1\) 位,本质上是在取 \(\{\vct v_n\}\) 的子集,所以预处理出每个子集对四个值的贡献,就能做到 \(\mathcal O(\log m\cdot(nx)^4\cdot2\cdot2\cdot2^n)\) 转移。

\(\mathscr{Code}\)

/*+Rainybunny+*/

#include <bits/stdc++.h>

#define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)
#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i) const int MAXN = 5, MAXX = 4, MAXS = 1 << MAXN, MOD = 998244353;
int n, m, x[MAXN], y[MAXN];
int px[MAXS], py[MAXS], nx[MAXS], ny[MAXS];
int f[2][MAXN * MAXX + 1][MAXN * MAXX + 1]
[MAXN * MAXX + 1][MAXN * MAXX + 1][2][2]; inline void addeq(int& u, const int v) { (u += v) >= MOD && (u -= MOD); } int main() {
// freopen("shape.in", "r", stdin);
// freopen("shape.out", "w", stdout); scanf("%d %d", &n, &m);
rep (i, 0, n - 1) scanf("%d %d", &x[i], &y[i]);
rep (S, 0, (1 << n) - 1) {
rep (i, 0, n - 1) if (S >> i & 1) {
if (x[i] > 0) px[S] += x[i];
else nx[S] -= x[i];
if (y[i] > 0) py[S] += y[i];
else ny[S] -= y[i];
}
} f[0][0][0][0][0][0][0] = 1;
int sta = 0;
rep (i, 0, 31 - __builtin_clz(m)) {
int mi = m >> i & 1;
rep (spx, 0, n << 2) rep (snx, 0, n << 2)
rep (spy, 0, n << 2) rep (sny, 0, n << 2) {
rep (upx, 0, 1) rep (upy, 0, 1) {
int& cur = f[sta][spx][snx][spy][sny][upx][upy];
if (!cur) continue;
rep (S, 0, (1 << n) - 1) {
int tpx = spx + px[S], tnx = snx + nx[S];
int tpy = spy + py[S], tny = sny + ny[S];
if ((tpx ^ tnx) & 1 || (tpy ^ tny) & 1) continue;
addeq(f[!sta][tpx >> 1][tnx >> 1][tpy >> 1][tny >> 1]
[(tpx & 1) != mi ? tpx & 1 : upx]
[(tpy & 1) != mi ? tpy & 1 : upy], cur);
}
cur = 0;
}
}
sta ^= 1;
}
printf("%d\n", (f[sta][0][0][0][0][0][0] + MOD - 1) % MOD);
return 0;
}

Solution -「CF 1290F」Making Shapes的更多相关文章

  1. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  2. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  3. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  4. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  5. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  6. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  7. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  8. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  9. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

  10. Solution -「CF 487E」Tourists

    \(\mathcal{Description}\)   Link.   维护一个 \(n\) 个点 \(m\) 条边的简单无向连通图,点有点权.\(q\) 次操作: 修改单点点权. 询问两点所有可能路 ...

随机推荐

  1. MySql5.7及以上 ORDER BY 报错问题

    一.问题 本人使用的MySql版本是8.0的 当MySql5.7及以上的版本执行带有 ORDER BY 的SQL语句时可能会报错. 例如,执行以下mysql语句: SELECT id, user_id ...

  2. vue,js直接导出excel,xlsx的方法,XLSX_STYLE 行高设置失效的问题解决,冻结窗体修改支持

    1.先安装依赖:xlsx.xlsx-style.file-saver三个包 npm install xlsx xlsx-style file-saver 出现错误: This relative mod ...

  3. layui下拉框xm-select自定义搜索使用方法

    xm-select介绍 始于Layui, 下拉选择框的多选解决方案 git地址:https://gitee.com/maplemei/xm-select 文档说明:https://codecp.tec ...

  4. 题解:洛谷P3745 期末考试(整数三分)

    题解:洛谷P3745 期末考试(整数三分) 题目传送门 题目大意:给出 \(n\) 个同学期望出成绩的时间限制 \(a_i\) 和 \(m\) 个学科公布成绩的初始时间 \(t_i\) ,1个同学每多 ...

  5. Flink on Yarn和k8s

    Yarn 架构 下图为作业提交到yarn的交互流程: 组件列表 ResourceManager (RM):ResourceManager (RM) 负责处理客户端请求.启动 / 监控 Applicat ...

  6. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)

    1.简介 上一篇文章,宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器,今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器. 2.eclipse中新建mav ...

  7. 超实用!阿里云应用——Air780EP低功耗4G模组AT开发示例

    ​ Air780EP是合宙推出的一款低功耗4G全网通模组,兼容模组行业1618经典封装,支持OpenCPU开发及全功能数传AT开发,可广泛应用于多样化的物联网终端. 针对客户朋友需求反馈,本期特别推出 ...

  8. CSS3 背景图片

    1.背景图大小(background-size) 这个属性设置单张背景图的大小,默认是原图的大小 当同时指定宽高时,会造成图片失真,如果要保持宽高比,可以使用 auto 字段让宽或者高自适应 值类型 ...

  9. C#调用Python代码的方式(二),以PaddleOCR-GUI为例

    前言 前面介绍了在C#中使用Progress类调用Python脚本的方法,但是这种方法在需要频繁调用并且需要进行数据交互的场景效果并不好,因此今天分享的是C#调用Python代码的方式(二):使用py ...

  10. 02C++顺序结构(1)

    1.C++程序的样子 2.流 输出流 COUT<< 3.一个实例及解析 4.小结 头文件的解释 头文件是C++程序对其他程序的引用,就是让编译器的预处理器把这个输入输出流的标准文件iost ...