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 

sl : 很傻比的状态压缩,直接背包就搞了,又傻逼了。

// by caonima

// hehe
#include <bits/stdc++.h>
using namespace std;
const int MAX= ;
const int inf = 0x3f3f3f3f;
int dp[MAX][<<],val[MAX],a[MAX],ans[MAX][<<];
int prime[MAX],vis[MAX],cur=;
vector<int> C;
void init() {
    memset(vis,,sizeof(vis));
    vis[]=;
    for(int i=;i<;i++) {
        if(!vis[i]) prime[cur++]=i;
        for(int j=i;j<;j+=i) vis[j]=;
    }
    return ;
}
int main() {
    init();
    int n;
    while(scanf("%d",&n)==) {
        memset(val,,sizeof(val));
        for(int i=;i<=n;i++) {
            scanf("%d",&a[i]);
        }
        for(int i=;i<;i++) {
            for(int j=;j<cur;j++) {
                if(i%prime[j]==) {
                    val[i]|=(<<j);
                }
            }
        }
        for(int i=;i<=n;i++) {
            for(int j=;j<(<<cur);j++) dp[i][j]=inf;
        }
        for(int i=;i<(<<cur);i++) dp[][i]=;
        for(int i=;i<=n;i++) {
            for(int j=;j<(<<cur);j++) {
                for(int k=;k<;k++) {
                    if((j&val[k])==) {
                        int res=dp[i-][j^val[k]]+abs(k-a[i]);
                        if(res<dp[i][j]) {
                            dp[i][j]=res;
                            ans[i][j]=k;
                        }
                    }
                }
            }
        }
        int res=inf ,state;
        for(int i=;i<(<<cur);i++) {
            if(res>dp[n][i]) {
                res=dp[n][i];
                state=i;
            }
        }
     //   printf("%d\n",ans[n][0]);
        for(int i=n;i>=;i--) {
            C.push_back(ans[i][state]);
            int k=ans[i][state];
            state=state^(val[k]);
        }
        for(int i=C.size()-;i>=;i--) {
            printf("%d ",C[i]);
        }
        printf("\n");
    }
    return ;
}
#include <bits/stdc++.h>
#define debug() printf("sss");
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAX = ;
int cur=,vis[MAX],prime[MAX],state[MAX];
vector<int> C;
int dp[MAX][<<],a[MAX],b[MAX],n,res[MAX][<<];
void init() {
    for(int i=;i<MAX;i++) {
        if(!vis[i]) prime[cur++]=i;
        for(int j=i;j<MAX;j+=i) vis[j]=;
    }
    memset(state,,sizeof(state));
    for(int i=;i<;i++) {
        for(int j=;j<;j++) {
            if(i%prime[j]==) state[i]|=(<<j);
        }
    }
}
int dfs(int pos,int s) {
    if(pos>n) return ;
    if(~dp[pos][s]) return dp[pos][s];
    int ans=inf;
    for(int i=;i<;i++) {
        if(s&state[i]) continue;
        int t=dfs(pos+,s|state[i])+abs(i-a[pos]);
        if(ans>t) {
            ans=t;
            res[pos][s]=i;
        }
    }
    return dp[pos][s]=ans;
}
int main() {
    init();

while(scanf("%d",&n)==) {
        for(int i=;i<=n;i++) {
            scanf("%d",&a[i]);
        }
        memset(dp,-,sizeof(dp));
        dfs(,);
        int s=;
       
        for(int i=;i<=n;i++) {
            C.push_back(res[i][s]);
            int k=res[i][s];
            s=s|(state[k]);
        }
        for(int i=;i<C.size();i++) {
            printf("%d ",C[i]);
        }
        printf("\n");
    }
}

Codeforces Round #259 (Div. 2) D的更多相关文章

  1. Codeforces Round #259 (Div. 2)AB

    链接:http://codeforces.com/contest/454/problem/A A. Little Pony and Crystal Mine time limit per test 1 ...

  2. Codeforces Round #259 (Div. 1) A. Little Pony and Expected Maximum 数学公式结论找规律水题

    A. Little Pony and Expected Maximum Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.c ...

  3. Codeforces Round #259 (Div. 2)

    A. Little Pony and Crystal Mine 水题,每行D的个数为1,3.......n-2,n,n-2,.....3,1,然后打印即可 #include <iostream& ...

  4. Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest

    题目范围给的很小,所以有状压的方向. 我们是构造出一个数列,且数列中每两个数的最大公约数为1; 给的A[I]<=30,这是一个突破点. 可以发现B[I]中的数不会很大,要不然就不满足,所以B[I ...

  5. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum (数学期望)

    题目链接 题意 : 一个m面的骰子,掷n次,问得到最大值的期望. 思路 : 数学期望,离散时的公式是E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn) p(xi)的是 ...

  6. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum

    题目链接 题意:一个m个面的骰子,抛掷n次,求这n次里最大值的期望是多少.(看样例就知道) 分析: m个面抛n次的总的情况是m^n, 开始m==1时,只有一种 现在增加m = 2,  则这些情况是新增 ...

  7. Codeforces Round #259 (Div. 2) D. Little Pony and Harmony Chest 状压DP

    D. Little Pony and Harmony Chest   Princess Twilight went to Celestia and Luna's old castle to resea ...

  8. Codeforces Round #259 (Div. 1)A(公式)

    传送门 题意 给出m个面的骰子扔n次,取最大值,求期望 分析 暴力算会有重复,而且复杂度不对. 考虑m个面扔n次得到m的概率,发现只要减去(m-1)个面扔n次得到m-1的概率即可,给出example说 ...

  9. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

随机推荐

  1. APP热修复

    APP热修复的概念: APP修复是针对修复app中的bug场景来定义的.当我们已上线的app出现bug的时候,我们想在用户不知情的情况下修复这个bug,那么就会用到热修复. APP热修复的实现原理: ...

  2. hdu3433A Task Process( 二分dp)

    链接 二分时间,在时间内dp[i][j]表示截止到第i个人已经做了j个A最多还能做多少个B #include <iostream> #include<cstdio> #incl ...

  3. 如何看Spring源码

    想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框架,而且是基于Java Config形式的零配置Spring框架. 首 ...

  4. greenplum4.3.8.2安装

    GREENPLUM总体结构:   数据库由Master Severs和Segment Severs通过Interconnect互联组成. Master主机负责:建立与客户端的连接和管理:SQL的解析并 ...

  5. vue路由细节探讨

    1.使用router-link 不会让页面刷新,使用a标签会使页面刷新.2.router-link 里面的to="/路由地址" tag=""自定义标签" ...

  6. vb,wps,excel 提取括号的数字

    Sub 抽离数字() Dim hang Range("h1").Select Columns("E:F").Select Selection.Clear Ran ...

  7. day24-1 元类

    目录 元类 类的组成 内置函数 exec() class关键字创建类原理 自定义元类控制类的创建 自定义元类控制类实例化 自定义元类后对象属性查找顺序 元类 在python中一切皆对象,name我们用 ...

  8. CREATE TRIGGER - 定义一个新的触发器

    SYNOPSIS CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | ...

  9. SQL GROUP BY 和 ORDER BY 区别

    order by 是按表中某字段排列表中数据group by 是按某些字段分类. 例如按 1.按年龄排序表中的记录select * from users order by age 2.按年龄分类表中数 ...

  10. 17Web服务器端控件

    Web服务器端控件 Web服务器端控件 ASP.Net提供了两类服务器端控件:Html服务器端控件和Web服务器端控件.由于Web服务器端控件功能更强大,和Windows应用程序的控件使用方法类似,容 ...