CodeForces 1103D. Professional layer
题目简述:给定$1 \leq n \leq 10^6$个正整数$1 \leq a_i \leq 10^{12}$,修改第$i$个正整数$a_i$的花费为$1 \leq e_i \leq 10^9$,以及正整数$1 \leq k \leq 10^{12}$。要求选出若干个正整数进行一次修改,使得修改后所有正整数的最大公约数等于$1$。修改操作为:对于正整数$a$,选择$a$的一个约数$d \leq k$,把$a$修改为$a/d$。设选出并修改的正整数有$x$个,他们的花费之和为$y$,则总的修改花费为$xy$。求最小花费。
解:code
设$d = \gcd (a_1, a_2, \dots, a_n) = p_1^{s_1} p_2^{s_2} \dots p_m^{s_m}$,其中$p_i$为互不相同的质数且$s_i \geq 1$。由$d \leq 10^{12}$,可知$m \leq 11$。
观察1:若$a_i$存在不同于$p_1, p_2, \dots, p_m$的质因数$p$,则将$a_i$替换为$a_i/p$不会影响最小花费。
故可假设$a_i = p_1^{s_{i1}} p_2^{s_{i2}} \dots p_m^{s_{im}}$,我们称满足这一条件的$a_i$为“正规化”的。
观察2:正规化的$a_i$序列中,不同元素个数$M \leq 11598$。这个上界当$d = 2 \cdot 3 \cdot 5 \cdot 7 \cdot 11 \cdot 13$时取到。
我们修改$a_i$的目标是,对任意$1 \leq j \leq m$,都存在一个$a_i$,使得$p_j \not| a_i$。为了最小花费,显然对任一$d$的质因数$p_j$,我们只需要选择恰好一个$a_i$,将其修改为不被$p_j$整除即可。因此:
观察3:我们最多只需要修改$m$个$a_i$。
从而真正有用的(即可能被修改的)$a_i$只能是:每种正规化$a_i$中,$e_i$值最小的$m$个。总共$m M$个。
对$mM$个真正有用的每个元素$(a_i, e_i)$, 枚举从$a_i$中除去的质因数的所有可能组合(一共需要检验$2^m-1$种可能)。若$a_i$可以除去质因数组合$s$,则记为$s \models a_i$。
我们把$(a_i, e_i)$按照$e_i$从小到大排序。令$F[i][x][s]$表示前$i$个元素中修改$x$个元素,且$s$描述了所除去的质因数的情况下的最小花费。则
$$ F[i][x][s] = \min_{t \subseteq s, t \models a_i} \{ F[i-1][x][s], F[i-1][x-1][s-t]+e_i \}. $$
动态规划有用状态数为$mM2^m$。
真正有用的元素及其除去的质因数组合并非$mM2^m$种,而是$m 2^m$种,因为对于每一种除去的质因数组合,我们同样也只会关心$e_i$值最小的$m$个。故在动态规划状态转移时,只需要考虑有用的元素及其质因数组合,假设$s$是【有用的$(a_i, e_i)$】的有用质因数组合,我们只需考虑以下动态规划转移:
$$ F[i+1][x+1][s \cup t] \gets \min \{ F[i+1][x+1][s \cup t], F[i][x][t]+e_i \}, $$
其中$t \cap s = \emptyset$。即,$t$枚举$s$的补的子集。(枚举子集方式可参见这里。)此种转移数至多为$m^2 3^m$。
综上,时间复杂度为$O(n \log n+m M 2^m+m^2 3^m)$。
CodeForces 1103D. Professional layer的更多相关文章
- Professional layer CodeForces - 1103D (状压,gcd)
大意: 给定$n$元素序列$a$, 现在想要让$gcd(a_1,a_2,...,a_n)=1$. 对于每个$a_i$可以除以一个不超过$k$的因子, 代价为$e_i$, 假设一共选择了$x$个元素去除 ...
- CF1103D Codeforces Round #534 (Div. 1) Professional layer 状压 DP
题目传送门 https://codeforces.com/contest/1103/problem/D 题解 失去信仰的低水平选手的看题解的心路历程. 一开始看题目以为是选出一些数,每个数可以除掉一个 ...
- 【题解】CF1103D Professional layer
[题解]CF1103DProfessional layer 神题做前先\(orzyyb\) 一个很好的性质(之前也见过但是没有想到的) zhengchu \(gcd\le 10^{12}\) 所以不同 ...
- CF1103D Professional layer 状压DP
传送门 首先对于所有数求gcd并求出这个gcd含有的质因子,那么在所有数中,只有这一些质因子会对答案产生影响,而且对于所有的数,每一个质因子只会在一个数中被删去. 质因子数量不会超过\(11\),所以 ...
- CF1103D Professional layer dp
正解:dp 解题报告: 传送门! 首先不难想到求个gcd,然后把gcd质因数分解成p1w1*p2w2*p3w3*...*pmwm 显然只要满足对每个p有一个ai%pj!=0就好,也就是说对每个pj找出 ...
- CodeForces 589B Layer Cake (暴力)
题意:给定 n 个矩形是a*b的,问你把每一块都分成一样的,然后全放一块,高度都是1,体积最大是多少. 析:这个题,当时并没有完全读懂题意,而且也不怎么会做,没想到就是一个暴力,先排序,先从大的开始选 ...
- Codeforces Round #102 (Div. 1) A. Help Farmer 暴力分解
A. Help Farmer 题目连接: http://www.codeforces.com/contest/142/problem/A Description Once upon a time in ...
- April Fools Day Contest 2016 G. You're a Professional
G. You're a Professional 题目连接: http://www.codeforces.com/contest/656/problem/G Description A simple ...
- CodeForces 35D Animals
G - Animals Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
随机推荐
- 【SQL Server 学习系列】-- 获取字符串中出现某字符的次数及字符某次出现的下标
) = '1_BB_CC_DD_AA_EE_YY_WW_HH_GG' --// 1. 获取下划线在字符串中出现的次数 SELECT LEN(@Str) - LEN(REPLACE(@Str, '_', ...
- FIREDAC字段类型映射
为什么需要字段类型映射? 作为通用型数据引擎的FIREDAC或者UNIDAC,驱动某一种数据库以后,总有一些数据库的一些字段类型,数据引擎不能识别,反应到程序中就是数据引擎不能正确地读取该字段的值 . ...
- [Cypress] install, configure, and script Cypress for JavaScript web applications -- part2
Use Cypress to test user registration Let’s write a test to fill out our registration form. Because ...
- (C++ STL)list的实现
#include <iostream> using namespace std; //採用迭代器和空间配置器所实现的双向链表的基本功能 template<class _Ty,clas ...
- 向C#的选项卡中添加自定义窗体
一.自定义窗体的搭建 这个比较简单,添加一个WinForm窗体就行了,设置一个名字EditPanel,然后在窗体上画需要的控件. 二.将自定义窗体添加到选项卡 // 新建窗体加入到选项卡中 EditP ...
- Solidworks工程图 如何绘制向视图,辅助视图
先画一条垂直于视野方向的中心线 点击辅助视图,然后点选刚才的中心线即可生成向视图 对向视图的标准可以得到一些用其他方法不好标注的尺寸
- linux字符设备驱动程序框架(老方法)
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #inclu ...
- Effective C++ 条款二 用编译器替换预编译器
/************************************************************************/ /* C++条款二:用编译器替换预编译器 */ / ...
- poj 3017 Cut the Sequence(单调队列优化DP)
Cut the Sequence \(solution:\) 这道题出的真的很好,奈何数据水啊! 这道题当时看得一脸懵逼,说二分也不像二分,说贪心也不像贪心,说搜索吧这题数据范围怎么这么大?而且这题看 ...
- React通用后台管理系统
react-admin 部分采用了antd,相关功能较全,添加了较多的组件模块.star 664 GitHub:https://github.com/yezihaohao/react-admin 在线 ...