Codeforces Round #259 (Div. 1) -- Little Pony and Harmony Chest,
Question connection
- Question:
Calculate a sequence bi for n Integers of ai, so that any two numbers in the B sequence are mutually dependent, and sigma (abs (ai-bi) is the smallest, and output any B sequence.
(1 digit ≤ DigitNMemory ≤ memory 100) (1 memory ≤ memoryAILimit ≤ Limit 30)
- Analysis:
First of all, it is clear that the scope of question B is not limited .... For this reason, wa has been performed many times, but it can be inferred that B must be less than or equal to 60.
Any two numbers are mutually qualitative. That is to say, if you know the quality factor of all the previous numbers for a newly added bi, It is a satisfying situation as long as the current number does not have this quality factor. There are less than 20 Prime numbers within 60, so you can directly press DP. DP [I] [j] indicates the number of I processed. The prime factor is j (in binary format)
const int MAXN = 60;const int SIZE = 16;int ipt[110];int dp[110][1 << SIZE];int p[110][1 << SIZE];int x[110][1 << SIZE];int to[MAXN + 1];int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};map<int, int> mp;void init(){ REP(i, SIZE) mp[prime[i]] = 1 << i; FE(ii, 0, MAXN) { int n = ii, ret = 0, i; for (i = 0; i < SIZE && prime[i] * prime[i] <= n; i++) if (n % prime[i] == 0) { while (n % prime[i] == 0) n /= prime[i]; ret += 1 << i; } if (n > 1) ret += mp[n]; to[ii] = ret; }}int n;void dfs(int idx, int id){ if (idx >= 2) dfs(idx - 1, p[idx][id]); printf("%d%c", x[idx][id], idx == n ? '\n' : ' ');}int main (){ int all = 1 << SIZE; init(); while (~RI(n)) { FE(i, 1, n) RI(ipt[i]); CLR(dp, INF); dp[0][0] = 0; FE(i, 0, n - 1) { FF(j, 0, all) { FE(jj, 0, MAXN) { int v = to[jj]; if (j & v) continue; int val = dp[i][j] + abs(jj - ipt[i + 1]); int& nxt = dp[i + 1][j | v]; if (val < nxt) { nxt = val; p[i + 1][j | v] = j; x[i + 1][j | v] = jj; } } } } int ans = INF, id = 0; REP(j, all) { if (dp[n][j] < ans) { ans = dp[n][j]; id = j; } } dfs(n, id); } return 0;}