D. Little Pony and Harmony Chest
time limit per test

4 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Princess Twilight went to Celestia and Luna's old castle to research the chest from the Elements of Harmony.

A sequence of positive integers bi is
harmony if and only if for every two elements of the sequence their greatest common divisor equals 1. According to an ancient book, the key of the chest is a harmony sequence bi which
minimizes the following expression:

You are given sequence ai,
help Princess Twilight to find the key.

Input

The first line contains an integer n (1 ≤ n ≤ 100)
— the number of elements of the sequences a and b.
The next line contains n integersa1, a2, ..., an (1 ≤ ai ≤ 30).

Output

Output the key — sequence bi that
minimizes the sum described above. If there are multiple optimal sequences, you can output any of them.

Sample test(s)
input
5
1 1 1 1 1
output
1 1 1 1 1 
input
5
1 6 4 2 8
output
1 5 3 1 8 

题目大意:

给出N个数ai,求出还有一个序列bi。要求sum |ai-bi|,最短,且全部的bi都互质。

解法:

这里题目给了几个非常显眼的条件。ai限制在了1~30之间。因为能够bi无限选1这个数。那么|ai-bi| 最大就是29了,意味着bi < 59的。

要求全部的bi互质,能够化为全部的bi分解出来的质因数均不同样。bi < 59,有16个质数。这里我们非常easy联想到状态压缩DP了。

用s表示当前阶段用了哪些质因数的状态,比如 s = 3 = 11 代表眼下状态下使用了第一个和第二个质因数。

非常快我们就能够写出状态转移方程:

f[i][s] = min(f[i-1][s^c[k]] + abs(a[i] - k))。    当中c[k]表示数字k使用了哪些质因数。

代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#define M_max 60
#define N_max 123
#define inf 0x3f3f3f3f using namespace std; int p[N_max], c[M_max], a[N_max];
int f[N_max][1<<16], pre[N_max][1<<16][2];
int n, cnt, minnum, minpos; void prime() {
for (int i = 2; i <= M_max; i++) {
bool flag = false; for (int j = 2; j <= sqrt(i); j++)
if (i%j == 0) {
flag = true;
break;
} if (!flag) p[++cnt] = i;
} for (int i = 1; i <= M_max; i++)
for (int j = 1; j <= cnt; j++)
if (i%p[j] == 0)
c[i] |= 1 << (j-1);
} void init() {
prime();
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
} void print(int x, int pos) {
if (x == 0) return;
print(x-1, pre[x][pos][0]);
printf("%d ", pre[x][pos][1]);
} void solve() {
memset(f, inf, sizeof(f));
memset(f[0], 0, sizeof(f[0]));
minnum = inf; for (int i = 1; i <= n; i++)
for (int s = 0; s < (1<<16); s++)
for (int k = 1; k <= M_max; k++)
if ((s&c[k]) == c[k]) {
int tmp = f[i-1][s^c[k]] + abs(a[i]-k); if (tmp < f[i][s]) {
f[i][s] = tmp;
pre[i][s][0] = s^c[k];
pre[i][s][1] = k;
}
}
for (int s = 0; s < (1<<16); s++)
if (f[n][s] < minnum) {
minnum = f[n][s];
minpos = s;
} print(n, minpos);
} int main() {
init();
solve();
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

codeforces Round #259(div2) D解决报告的更多相关文章

  1. codeforces Round #259(div2) E解决报告

    E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 meg ...

  2. codeforces Round #260(div2) D解决报告

    D. A Lot of Games time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  3. codeforces Round #259(div2) C解题报告

    C. Little Pony and Expected Maximum time limit per test 1 second memory limit per test 256 megabytes ...

  4. codeforces Round #258(div2) D解题报告

    D. Count Good Substrings time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. Codeforces Round #259(div2)C(数学期望)

    数学题. 关键是求最大值为k时有多少种情况,结果是kn-(k-1)n-1.可以这么想:每一次都从1至k里选,共kn种,这里需要再减去每一次都从1至k-1里面选的情况.当然也可以分类计数法:按出现几次k ...

  6. codeforces Round #258(div2) C解题报告

    C. Predict Outcome of the Game time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  7. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  8. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  9. 【前行】◇第3站◇ Codeforces Round #512 Div2

    [第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...

随机推荐

  1. js+html实现遮罩层效果(收藏哦)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script ty ...

  2. Linux系统编程——线程私有数据

    在多线程程序中.常常要用全局变量来实现多个函数间的数据共享.因为数据空间是共享的,因此全局变量也为全部线程共同拥有. 測试代码例如以下: #include <stdio.h> #inclu ...

  3. ios开发零散知识点总结

    1:当有导航栏的时候,子视图为UIScrollView,或是继承于UIScrollView的控件如UITableView,UICollectionView等,控制器会自动调用 self.automat ...

  4. IdentityServer4实战 - JWT Token Issuer 详解

    原文:IdentityServer4实战 - JWT Token Issuer 详解 一.前言 本文为系列补坑之作,拖了许久决定先把坑填完. 下文演示所用代码采用的 IdentityServer4 版 ...

  5. 用Java对CSV文件进行读写操作

    需要jar包:javacsv-2.0.jar 读操作 // 读取csv文件的内容 public static ArrayList<String> readCsv(String filepa ...

  6. [Now] Configure secrets and environment variables with Zeit’s Now

    Often your project will require some secret keys or tokens - for instance, API keys or database auth ...

  7. js页面加载函数

    在未加载完文档,使用jquery选择器选择元素后,如果立即绑定事件进行调用,会引起js的报错(can not read property of undefined),导致事件不能绑定成功. alert ...

  8. Operating system coordinated thermal management

    A processor's performance state may be adjusted based on processor temperature. On transitions to a ...

  9. [转]erlang ranch

    一. ranch app启动: ranch_sup -> ranch_server % 创建ets, 并提供接口给其他进程读写 二. 启动diy app (监听模块: 用ranch_tcp -& ...

  10. 【26.09%】【codeforces 579C】A Problem about Polyline

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...