454D - Little Pony and Harmony Chest 思路: 状压dp,由于1的时候肯定满足题意,而ai最大是30,所以只要大于等于59都可以用1替换,所以答案在1到59之间 然后筛出1到58之间的质数,只有16个,把1到58的数的状态由这16个质数表示,如果整除这个质数则二进制中这一位为1,否则则为0 状态:dp[i][j]表示到第i个数为止选取的数的状态为j的最小差和 初始状态:dp[0][0]=0 状态转移: dp[i+1][j|sta[k]]=min(dp[i+1][…
题目链接:http://codeforces.com/problemset/problem/453/B 题意: 给你一个长度为n的数列a,让你构造一个长度为n的数列b. 在保证b中任意两数gcd都为1的情况下,使得 ∑|a[i]-b[i]|最小. 让你输出构造的数列b. (1<=n<=100, 1<=a[i]<=30) 题解: 因为1<=a[i]<=30,所以有1<=b[i]<=60,此时才有可能最优. 因为b中任意两数gcd为1,所以对于一个质因子p[i]…
Little Pony and Harmony Chest 经典状态压缩dp #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #define min(x,y) (x>y?y:x) using namespace std; ],all,n,a[],b[][<<],pre[][<<],s1,s0,f[][<<],ans…
D. Little Pony and Harmony Chest   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…
CF453B CF454D Codeforces Round #259 (Div. 2) D Codeforces Round #259 (Div. 1) B 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 C…
[CF453B]Little Pony and Harmony Chest 题目大意: 给你一个长度为\(n(n\le100)\)的正整数序列\(A(A_i\le30)\),求一个正整数序列\(B\),使得\(\sum_{i=1}^n |A_i-B_i|\)最小,且\(B\)中所有互质. 思路: 由于\(B_i\ge59\)时用\(1\)代替时不会更差,因此我们只需要考虑\(B_i\le58\)的情况.由于质因数只有\(16\)个,因此可以状压DP.另外记录转移即可. 源代码: #include…
Little Pony and Harmony Chest 题解: 因为 1 <= ai <= 30 所以  1 <= bi <= 58, 因为 59 和 1 等效, 所以不需要59. [1, 58]只有16个质数,对于这16个质数去状压. 对于1->58的数,我们计算出每个数对于质数来说的状态,然后转移. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_i…
M - Little Pony and Harmony Chest 怎么感觉自己越来越傻了,都知道状态的定义了还没有推出转移方程. 首先这个a的范围是0~30   这里可以推出 b数组的范围 0~60 原因很简单,因为这个要求abs(b-a)) 尽量小,所以如果b>=60 那还不如用1 ,因为1 的数量是没有限制的, 当 b>60 abs(b-a)>30 所以相比 b>60 b==1 更优. 然后我们对质数进行状压,为什么要对质数进行状压呢,因为质数两两互质,而且每一个数都是由若干…
题目链接:http://codeforces.com/contest/454/problem/D 题意:给定一个序列a, 求一序列b,要求∑|ai−bi|最小.并且b中任意两数的最大公约数为1. 题解:首先要满足最大公约数为1只要控制b中的最小素因数就行.由于a最大之后30,所以加的数肯定不会超过60 如果超过了,直接选择1更小,然后1-60内最多只有17个素数,所以最多状态就是1<<17于是可以考虑一下状压 dp,dp[i][s]表示前i个数拥有素因数的状态为s,然后是转移 x = stat…
题目范围给的很小,所以有状压的方向. 我们是构造出一个数列,且数列中每两个数的最大公约数为1; 给的A[I]<=30,这是一个突破点. 可以发现B[I]中的数不会很大,要不然就不满足,所以B[I]<=60左右.构造DP方程DP[I][J]=MIN(DP[I][J],DP[I][J^C[K]]+abs(a[i]-k)); K为我们假设把这个数填进数组中的数.同时开相同空间记录位置,方便输出结果.. #include<iostream> #include<stdio.h>…