【题解】CF1103DProfessional layer

神题做前先\(orzyyb\)

一个很好的性质(之前也见过但是没有想到的)

zhengchu

\(gcd\le 10^{12}\) 所以不同的质因数\(\le 12\)

所以对这\(12\)个质因数状压。

所以答案显然小于等于\(12\)

对于每个数,只有因数和全局\(gcd\)有关的才有用,其余没用。

所以每种数(意会一下,就是和\(gcd​\)关系一样的数)最多只需要\(12​\)个,所以可以把\(n​\)将下来。

然后就愉快地\(dp​\)了(说的轻巧)

设\(dp(i,STATE)​\)表示已经选用了\(i​\)个数,现在\(gcd​\)的质因数还剩\(STATE​\)的状态

假如一个状态转移了\(\ge 13​\)次,那么一定是不优的。开个数组记录顺便剪枝。转移方程

\[dp(i,k' \subset k)=min\{ dp(i-1,k)+e[i]\},(cnt(k)<13)
\]

\[dp(0,0)=0
\]

实际上\(13​\)可以优化到\(d​\)全局\(gcd​\)的质因数个数\(m​\)

有一个状压的技巧,如何枚举子集?$j \subset k $

  • 知道\(j\)
for(register int k=(j+1)|j;k<=S;k=(k+1)|j)
  • 知道\(k​\)
for(register int j=(k-1)&k;j;j=(j-1)&k)

上抄zsy的代码

#include<bits/stdc++.h>

using namespace std;typedef long long ll;
#define DRP(t,a,b) for(register ll t=(a),edd=(b);t>=edd;--t)
#define RP(t,a,b) for(register ll t=(a),edd=(b);t<=edd;++t)
#define ERP(t,a) for(register ll t=head[a];t;t=e[t].nx)
#define pu(x) seg[x]=seg[(x)<<1]+seg[(x)<<1|1]
#define lef l,mid,pos<<1
#define rgt mid+1,r,pos<<1|1
#define all 1,n,1
#define re register
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >
TMP inline ccf qr(ccf b){
register char c=getchar();register int q=1;register ccf x=0;
while(c<48||c>57)q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)x=x*10+c-48,c=getchar();
return q==-1?-x:x;}
TMP inline ccf Max(ccf a,ccf b){return a<b?b:a;}
TMP inline ccf Min(ccf a,ccf b){return a<b?a:b;}
TMP inline ccf Max(ccf a,ccf b,ccf c){return Max(a,Max(b,c));}
TMP inline ccf Min(ccf a,ccf b,ccf c){return Min(a,Min(b,c));}
TMP inline void Swap(ccf& a,ccf& b){re ccf c=b;b=a;a=c;}
TMP inline void READ(ccf* _arr,int _n){RP(t,1,_n)_arr[t]=qr((ccf)1);}
//----------------------template&IO---------------------------
const int maxn=1e6+15;
//const ll mod=1e9+7;
inline ll gcd(ll x,ll y){
for(register ll t=x;y;t=y,y=x%y,x=t);
return x;
}
int n,m,S,e[maxn],vis[1<<12];
ll d,k,a[maxn],p[maxn],f[13][1<<12],ans,inf;
map < ll ,vector<int> >mp;
int main(){
#ifndef ONLINE_JUDGE
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
#endif
n=qr(1);k=qr(1ll);
RP(t,1,n) d=gcd(a[t]=qr(1ll),d);
RP(t,1,n) e[t]=qr(1ll);
for(register ll t=2;t*t<=d;++t){
if(d%t==0){
p[m++]=t;
while(d%t==0) d/=t;
}
}
if(d>1) p[m++]=d;
S=(1<<m)-1;
RP(t,1,n){
register ll temp=1;
RP(k,0,m-1){
while(a[t]%p[k]==0) a[t]/=p[k],temp*=p[k];
}
mp[temp].push_back(e[t]);
}
memset(f,63,sizeof f);
ans=inf=f[0][0];f[0][0]=0;
for(register auto pr:mp){
ll x=pr.first;sort(pr.second.begin(),pr.second.end());
if((int)pr.second.size()>m) pr.second.resize(m);
RP(t,0,S){
ll y=x,z=1;
RP(i,0,m-1)
if(t>>i&1)
while(y%p[i]==0) y/=p[i],z*=p[i];
vis[t]=(z<=k);
}
for(register auto cost:pr.second){
register bool fg=0;
for(register int i=m-1;~i;--i)
for(register int j=0;j<=S;++j)
if(f[i][j]<inf)
for(register int k=(j+1)|j;k<=S;k=(k+1)|j)
if(vis[k^j])
if(f[i+1][k]>f[i][j]+cost)
fg=1,(f[i+1][k]=f[i][j]+cost);
if(not fg) break;
}
}
RP(t,0,m)if(f[t][S]<inf) ans=Min(ans,f[t][S]*t);
if(ans==inf) puts("-1");
else cout<<ans<<endl;
return 0;
}
// orz zsy

【题解】CF1103D Professional layer的更多相关文章

  1. CF1103D Professional layer 状压DP

    传送门 首先对于所有数求gcd并求出这个gcd含有的质因子,那么在所有数中,只有这一些质因子会对答案产生影响,而且对于所有的数,每一个质因子只会在一个数中被删去. 质因子数量不会超过\(11\),所以 ...

  2. CF1103D Professional layer dp

    正解:dp 解题报告: 传送门! 首先不难想到求个gcd,然后把gcd质因数分解成p1w1*p2w2*p3w3*...*pmwm 显然只要满足对每个p有一个ai%pj!=0就好,也就是说对每个pj找出 ...

  3. CF1103D Codeforces Round #534 (Div. 1) Professional layer 状压 DP

    题目传送门 https://codeforces.com/contest/1103/problem/D 题解 失去信仰的低水平选手的看题解的心路历程. 一开始看题目以为是选出一些数,每个数可以除掉一个 ...

  4. Professional layer CodeForces - 1103D (状压,gcd)

    大意: 给定$n$元素序列$a$, 现在想要让$gcd(a_1,a_2,...,a_n)=1$. 对于每个$a_i$可以除以一个不超过$k$的因子, 代价为$e_i$, 假设一共选择了$x$个元素去除 ...

  5. 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$,以 ...

  6. 题解 CF656G 【You're a Professional】

    又是一道假黑题 它教会我们不要看难度标签 虽然这道题的数据范围很小,用cin能过,但我还是要讲一下快读 快读嘛,顾名思义,就是 快速读入 的意思 有同学就会问了,快速读入的原理是什么? 答:它的原理其 ...

  7. HDU 4374 One hundred layer DP的单调队列优化

    One hundred layer Problem Description   Now there is a game called the new man down 100th floor. The ...

  8. 【CF486E】LIS of Sequence题解

    [CF486E]LIS of Sequence题解 题目链接 题意: 给你一个长度为n的序列a1,a2,...,an,你需要把这n个元素分成三类:1,2,3: 1:所有的最长上升子序列都不包含这个元素 ...

  9. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

随机推荐

  1. POJ 3480 John [博弈之Nim 与 Anti-Nim]

    Nim游戏:有n堆石子,每堆个数不一,两人依次捡石子,每次只能从一堆中至少捡一个.捡走最后一个石子胜. 先手胜负:将所有堆的石子数进行异或(xor),最后值为0则先手输,否则先手胜. ======== ...

  2. 某考试T2 frog

    题目背景 无 题目描述 数轴上有 n 只青蛙,分别编号为 1 到 n.青蛙 i 的初始位置的坐标为 xi. 它们准备进行如下形式的移动:每轮包括 m 次跳跃,第 i 次跳跃由青蛙 ai(1 < ...

  3. Apache Openwhisk学习(一)

    一.背景 最近中途参与的一个项目是和Serverless.Faas相关的,项目的整体架构和实现都参考了开源项目openwhisk,因此,同事们在编码时都会参考openwhisk的源码.因为以前从没有接 ...

  4. mysqldump实践

    mysqldump   mysqldump---逻辑备份,热备 单线程,适合数据量小的库 mysql官方自带的命令行工具   #全库 )mysqldump -uroot -p123456 --sock ...

  5. iOS应用崩溃日志揭秘2

    这篇文章还可以在这里找到 英语 场景 4: 吃棒棒糖时闪退! 用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了 ...

  6. 【spring cloud】注解@SpringCloudApplication和@SpringBootApplication的区别

    @SpringCloudApplication和@SpringBootApplication的区别

  7. 在网页中插入flash播放器,播放flv视频

    效果图如下: 所用代码如下: <object id="FLVPlayer" height="480" width="640" code ...

  8. nohup 输出重定向

    今天在使用nohup命令的时候,每次后台执行生成的日志文件名都为nohup.out,现需要改变nohup命令生成的文件名. 在shell中,文件描述符通常是:STDIN标准输入,STDOUT标准输出, ...

  9. docker入门小结(一)

    入职需要学习docker,记录学习随笔.争取两天大致看完docker学习.博客也算是迁移到cnblogs. 学习的链接参考<docker从入门到实践>http://dockerpool.c ...

  10. 记一个发HTML格式邮件的问题

    很早做了一个自动发邮件的程序,前一向发现Notes升级后反而CSS样式都没有了. 起初不以为意,反正格式数据在,客户也没说啥,后来觉得这样的态度要不得,小洞不补,大洞吃苦. 于是查查资料,发现浏览器里 ...