Codeforces 题面传送门 & 洛谷题面传送门

数位 dp 好题。

首先,由于是凸包,一但向量集合确定,凸包的形态肯定就已经确定了。考虑什么样的向量集合能够组成符合条件的凸包,我们假设第 \(i\) 个向量选了 \(c_i\) 次。因为凸包是首尾相连的,所以必然有 \(\sum\limits_{i=1}^nc_ix_i=0,\sum\limits_{i=1}^nc_iy_i=0\)。上式也可写作 \(\sum\limits_{x_i>0}c_ix_i=\sum\limits_{x_i<0}c_i(-x_i),\sum\limits_{y_i>0}c_iy_i=\sum\limits_{y_i<0}c_i(-y_i)\)。其次,由于凸包能够被放到 \(m\times m\) 的矩形内,所以凸包横纵坐标的极差必须 \(\le m\),以横坐标为例,还是因为原图是一个凸包,所以凸包的横坐标肯定是先涨一段,再跌到最低点,再涨到 \(0\),因此横坐标的极差为 \(\sum\limits_{x_i<0}c_i(-x_i)\),同理纵坐标的极差为 \(\sum\limits_{y_i<0}c_i(-y_i)\),因此一组 \(\{c_1,c_2,\cdots,c_n\}\) 符合条件的充要条件是:

  • \(\sum\limits_{x_i>0}c_ix_i=\sum\limits_{x_i<0}c_i(-x_i),\sum\limits_{y_i>0}c_iy_i=\sum\limits_{y_i<0}c_i(-y_i)\)
  • \(\sum\limits_{x_i<0}c_i(-x_i)\le m,\sum\limits_{y_i<0}c_i(-y_i)\le m\)

接下来思考怎样求符合条件的 \(\{c_1,c_2,\cdots,c_n\}\) 的个数。注意到 \(n\) 很小,值域也很小,因此考虑数位 DP,考虑从低到高逐位确定 \(c_i\) 每一位的值,记 \(dp_{d,px,py,nx,ny,p,q}\) 表示当前确定了最低的 \(d\) 位,当前为正的 \(x_i\) 的 \(\sum c_ix_i\) 产生了 \(px\) 的进位,当前为负的 \(x_i\) 的 \(\sum c_i(-x_i)\) 产生了 \(nx\) 的进位,当前为正的 \(y_i\) 的 \(\sum c_iy_i\) 产生了 \(py\) 的进位,当前为负的 \(x_i\) 的 \(\sum c_i(-y_i)\) 产生了 \(ny\) 的进位,当前 \(\sum\limits_{x_i>0} c_ix_i\) 的后 \(d\) 位是否 \(\le m\) 的后 \(d\) 位,当前 \(\sum\limits_{y_i>0} c_iy_i\) 的后 \(d\) 位是否 \(\le m\) 的后 \(d\) 位的符合条件的 \(\{c_i\}\) 的个数,转移就枚举这 \(n\) 个数第 \(d+1\) 位的值即可。

复杂度 \(20^4·2^5·\log m\),可以通过。写成记忆化搜索的形式可能会跑得快一点。

总结:看到求 \(\sum\limits_{i=1}^na_ic_i=X\) 的 \(\{c_i\}\) 的组数,并且 \(n,a_i\) 都很小而 \(X\) 很大的题目可以想到数位 DP,类似的还有这个题

const int MOD=998244353;
int n,m,x[7],y[7],dp[34][23][23][23][23][2][2];
void add(int &x,int v){((x+=v)>=MOD)&&(x-=MOD);}
int chk(int dm,int dn,int ori){
if(dm^dn) return (dn<dm)?0:1;
return ori;
}
int calc(int p,int ps_x,int ps_y,int ng_x,int ng_y,int xm,int ym){
if(p==30) return (!ps_x&&!ps_y&&!ng_x&&!ng_y&&!xm&&!ym);
if(~dp[p][ps_x][ps_y][ng_x][ng_y][xm][ym]) return dp[p][ps_x][ps_y][ng_x][ng_y][xm][ym];
int d=m>>p&1;dp[p][ps_x][ps_y][ng_x][ng_y][xm][ym]=0;
for(int s=0;s<(1<<n);s++){
int tps_x=ps_x,tps_y=ps_y,tng_x=ng_x,tng_y=ng_y;
for(int i=1;i<=n;i++) if(s>>(i-1)&1){
(x[i]>0)?(tps_x+=x[i]):(tng_x-=x[i]);
(y[i]>0)?(tps_y+=y[i]):(tng_y-=y[i]);
} int d_px=tps_x&1,d_py=tps_y&1,d_nx=tng_x&1,d_ny=tng_y&1;
if(d_px==d_nx&&d_py==d_ny)
add(dp[p][ps_x][ps_y][ng_x][ng_y][xm][ym],
calc(p+1,tps_x>>1,tps_y>>1,tng_x>>1,tng_y>>1,chk(d,d_px,xm),chk(d,d_py,ym)));
} return dp[p][ps_x][ps_y][ng_x][ng_y][xm][ym];
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
memset(dp,-1,sizeof(dp));
printf("%d\n",(calc(0,0,0,0,0,0,0)-1+MOD)%MOD);
return 0;
}

Codeforces 1290F - Making Shapes(数位 dp)的更多相关文章

  1. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  2. Codeforces Gym 100231L Intervals 数位DP

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description Start with an integer, N0, ...

  3. Codeforces #55D-Beautiful numbers (数位dp)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  4. Codeforces - 55D Beautiful numbers (数位dp+数论)

    题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...

  5. CodeForces - 55D - Beautiful numbers(数位DP,离散化)

    链接: https://vjudge.net/problem/CodeForces-55D 题意: Volodya is an odd boy and his taste is strange as ...

  6. CodeForces 628D Magic Numbers (数位dp)

    题意:找到[a, b]符合下列要求的数的个数. 1.该数字能被m整除 2.该数字奇数位全不为d,偶数位全为d 分析: 1.dp[当前的位数][截止到当前位所形成的数对m取余的结果][当前数位上的数字是 ...

  7. FZU2179/Codeforces 55D beautiful number 数位DP

    题目大意: 求  1(m)到n直接有多少个数字x满足 x可以整出这个数字的每一位上的数字 思路: 整除每一位.只需要整除每一位的lcm即可 但是数字太大,dp状态怎么表示呢 发现 1~9的LCM 是2 ...

  8. Codeforces 981 D.Bookshelves(数位DP)

    Codeforces 981 D.Bookshelves 题目大意: 给n个数,将这n个数分为k段,(n,k<=50)分别对每一段求和,再将每个求和的结果做与运算(&).求最终结果的最大 ...

  9. codeforces 55D. Beautiful numbers 数位dp

    题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ...

随机推荐

  1. pip 安装软件报 Requirement already satisfied

    pip 安装的时候报错了,以为是豆瓣源有问题,换了还是一样,于是我们只需要加入一个参数 --target=路径    给它一个指定的位置就可以解决这个问题 安装位置不变,只是增加了一个参数在后面

  2. Idea Maven auto Import

  3. mipi csi接口,1条lane支持多少像素,200w像素需要几条lane,为什么,怎么计算出来的?谢谢!

    按帧频FRAME=60HZ, 分辨率480*800来计算;以WVGA 显示分辨率,24BIT图片,60幁为例,在理想状态下(未包含RGB信号前后肩宽度),总传输速率最小为:480*800*8BIT*3 ...

  4. Go并发编程--Mutex/RWMutex

    目录 一.前言 二. Mutex 2.1 案例 三. 实现原理 3.1 锁的实现模式 3.2 Go Mutex 实现原理 3.2.1 加锁 3.2.2 解锁 四. 源码分析 4.1 Mutex基本结构 ...

  5. Linux 显示ip、dns、网关等命令

    在新版的ubuntu 终端里输入命令nm-tool, 想查看网络参数设置, 没想到却返回如下内容:   未找到 'nm-tool' 命令,您要输入的是否是:  命令 'dm-tool' 来自于包 'l ...

  6. Dubbo框架协议总结

    Dubbo支持的各种协议及相关特性及应用场景,均可在官网文档中找到. 支持的协议有dubbo.rmi.hession.http.webservice.thrift.memcached.redis.re ...

  7. python基础数据类型语法

    #标识符:我们自己在写代码的时候,取的名字.#项目名 project name#包名 package name#模块名 .py ptthon文件名#规范:由字母数字下划线组成,但不能以数字#简明知意: ...

  8. Windows内核中的CPU架构-6-中断门(32-Bit Interrupt Gate)

    Windows内核中的CPU架构-6-中断门(32-Bit Interrupt Gate) 中断门和调用门类似,也是一种系统段.同样的它也可以用来提权. 中断门: 虽然中断门的段描述符如下: 但是中断 ...

  9. PTA 7-1 公路村村通 (30分)

    PTA 7-1 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...

  10. SVN错误:Attempted to lock an already-locked dir svn: Working copy locked

    VN错误:Attempted to lock an already-locked dir update D:/workspace20/SC_200/metadata -r 3398 --force   ...