题意

B 君的第三题(shenyang)

题目描述

客似云来,万里无云

B 君得到了一个数组\(\{a_1,a_2,\dots,a_n\}\)。

B 君想通过修改让数组中个每对数都互质。

每次使一个数+1 或者-1 的代价是1。

不能将\(a_i\) 修改为0 或者负数。

问至少多少代价才可以让所有数两两互质。

输入格式

第一行一个整数n。

第二行n 个整数\(a_i\),表示数组初始值。

输出格式

一行一个数表示答案。

样例输入

5

2 4 6 8 10

样例输出

4

样例解释

修改为2, 3, 5, 7, 11。

数据规模与约定

对于100% 的数据,满足\(1 \leq n \leq 100, 1 \leq a_i \leq 30\)。

对于30% 的数据,满足\(1 \leq n \leq 4\)。

对于另30% 的数据,满足\(1 \leq a_i \leq 10\)。

分析

因为\(a_i \leq 30\),1跟所有数互质,所以往下最多改到1,往上最多改到59,所以每个数所含质因数是固定的。

考虑dp,用\(f(i,s)\)表示前i个数改动至只含s集合中的质因数且两两互质所需最小代价,转移方程为:

\[枚举i改成x,x所含质因数集合为s \\
枚举从原来的含k的集合转移过来,其中k与s没有交集 \\
f(i,k∨s)=\min_{x=1}^{59}f(i-1,k)+|a_i-x|
\]

时间复杂度\(O(n \cdot 59 \cdot 2^{17})\),上界十分不紧。

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read()
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return data*w;
}
template<class T> il T read(T&x)
{
return x=read<T>();
}
typedef long long ll;
const int INF=0x7fffffff; int p[17]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}; il int bit(rg int x)
{
rg int s=0;
for(rg int i=0;i<17;++i)
if(x%p[i]==0)
s|=(1<<i);
return s;
}
int b[60]; const int MAXN=107;
int f[MAXN][1<<17]; int main()
{
freopen("shenyang.in","r",stdin);
freopen("shenyang.out","w",stdout);
memset(f,0x3f,sizeof f);
f[0][0]=0;
rg int n=read<int>();
for(rg int i=1;i<=59;++i)
b[i]=bit(i);
for(rg int i=1;i<=n;++i)
{
rg int a=read<int>();
for(rg int j=1;j<=59;++j)
{
rg int ub=((1<<17)-1)^b[j];
for(rg int k=ub;;--k&=ub)
{
f[i][k|b[j]]=min(f[i][k|b[j]],f[i-1][k]+abs(a-j));
if(k==0)
break;
}
}
}
rg int ans=INF,up=(1<<17)-1;
for(rg int i=0;i<=up;++i)
ans=min(ans,f[n][i]);
printf("%d\n",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}

test20181018 B君的第三题的更多相关文章

  1. test20181016 B君的第三题

    题意 B 君的第三题(haskell) 题目描述 大学四年,我为什么,为什么不好好读书,没找到和你一样的工作. B 君某天看到了这样一个题,勾起了无穷的回忆. 输入\(n, k\) 和一棵\(n\) ...

  2. test20181015 B 君的第三题

    题意 B 君的第三题(zhengzhou) 题目描述 让你在战争和耻辱中做一块选择,你选择耻辱,可你将来还得进行战争. 在平面上有n 个整点(横纵坐标都是整数) B 君想找到一个整点,使得这个点,到所 ...

  3. test20181019 B君的第三题

    题意 B 君的第三题(urumqi) 题目描述 风雨如晦,鸡鸣不已. B 君最近在研究自己的学长都在做什么工作,每个学长属于一个公司. B 君会获得一些信息,比如x 和y 在相同公司,x 和y 在不同 ...

  4. noiac132 B君的第三题 (树形dp)

    传送门 本来想用点分治做,结果root又求不对 算的时候还算错了 我好菜啊 结果szr大佬告诉我是树形dp 我好菜啊!! 我们有$\lceil \frac{x}{k} \rceil = \frac{x ...

  5. shanquan2的两年三题系列

    好像只有2个月就退役啦 不管了,先说一下哪三题:多点求值.lcm.替罪羊树(bzoj3065) [upd0]2016.3.29 多点求值A掉啦,myy卡常数sxbk(不是说好的是shanquan2出的 ...

  6. Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l

    第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; ...

  7. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  8. NOIP2008提高组(前三题) -SilverN

    此处为前三题,第四题将单独发布 火柴棒等式 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0 ...

  9. 《学习OpenCV》练习题第四章第三题b

    #include <highgui.h> #include <cv.h> #include "opencv_libs.h" /* *<学习OpenCV ...

随机推荐

  1. poj3608 Bridge Across Islands

    地址:http://poj.org/problem?id=3608 题目: Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536 ...

  2. 《FontForge常见问题FAQ》字王翻译版

    <FontForge常见问题FAQ> 字王翻译版 原文: http://fontforge.github.io/en-US/faq/ 翻译: 字王·中国   blog: http://bl ...

  3. python webdriver 显示等待-自动登录126邮箱,添加联系人

    脚本内容:#encoding=utf-8#author-夏晓旭from selenium import webdriverimport timefrom selenium.webdriver.supp ...

  4. java -- JVM的符号引用和直接引用

    在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...

  5. Mysql优化_ORDER BY和GROUP BY 的优化讲解(单路排序和双路排序)

    ORDER BY 子句尽量使用Index方式排序,避免使用FileSort方式排序,尽可能在索引列上外城排序操作,遵照索引键的最佳左前缀.如果不在索引列上,FileSort有两种算法,Mysql就要启 ...

  6. 2017-2018-1 JaWorld 第三周作业

    2017-2018-1 JaWorld 第三周作业 团队展示 队员学号 队名 团队项目描述 队员风采 团队的特色 团队合照 团队初步合作 前两周的反思与总结 需要改进的地方 团队选题 *采访老师或有开 ...

  7. 2017-2018-1 JaWorld 第六、七周作业

    2017-2018-1 JaWorld 第六.七周作业 修改需求规格说明书 上次的<需求规格说明书>初稿有哪些不足? 王译潇同学回答:   1. 引言和目的性考虑的不是很周全.   2. ...

  8. [微信开发] - UnionID以及微信开放平台

  9. $n,$!等的含义

    $$ Shell本身的PID(ProcessID)$! Shell最后运行的后台命令的PID$? 上一个运行的命令是否成功的标志,成功为0,失败不为0$* 所有参数列表.如"$*" ...

  10. node+websocket创建简易聊天室

    关于websocket的介绍太多,在这就不一一介绍了,本文主要实现通过websocket创建一个简易聊天室,就是90年代那种聊天室 服务端 1.安装ws模块,uuid模块,ws是websocket模块 ...