GCD + DP + 调和级数/埃式筛

[Problem - D - Codeforces](https://codeforces.com/contest/1610/problem/D)

题意

给出一个长度为 \(n\;(1<=n<=10^5)\) 的数组 \(a[i]\;(1<=a[i]<=2*10^7)\)

可以重新排列 \(a\) 数组,使得 \(\sum\limits_{i=1}^n\gcd(a_1,a_2,...,a_i)\) 最大

思路

  1. 设 \(cnt[x]\) 为 \(x\) 的倍数有多少个,easy版本可用调和级数,hard版本可 \(n*\sqrt{a[i]}\) 分解因数

  2. 若 \(x\) 开头,最优策略是把 \(x\) 的倍数全都紧接着放在 \(x\) 之后,他们的贡献为 \(cnt[x]*x\)

  3. 设以 \(x\) 作为 \(gcd(a[1])\) 的答案为 \(f[x]\)(这里并非 \(a[1]\) 开头 \(gcd(a[1])\) 就是 \(a[1]\), \(a[1]\) 的任何因数都可以), 把 \(x\) 的倍数 \(y\) 放到 \(x\) 的前面时会更优,因此 \(f[x]->f[y]\) 转移

  4. 在 \(f[x]\) 向 \(f[y]\) 转移的过程中,除了 \(x\) 的倍数 \(cnt[x]\) 个以外的 \(n-cnt[x]\) 个数对贡献并没有改变

    且是 \(x\) 的倍数但不是 \(y\) 的倍数的数的贡献也没有改变,只有 \(cnt[y]\) 个数的贡献由 \(x\) 变成了 \(y\), 因此转移方程为

    \(f[y]=max(f[y],f[x]+(y-x)*cnt[y])\)

  5. easy 版本可用调和级数;hard版本考虑优化,其实并非 \(x\) 向它的每个倍数 \(y\) 都需要转移,只需要转移向素数倍的 \(y\) 就行(感受一下,应该也可以证)

    类比埃式筛,时间复杂度为 \(O(nloglogn)\)

    代码

#include <bits/stdc++.h>
using namespace std;
#define endl "\n" typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e7 + 10;
ll f[N];
int n;
ll cnt[N];
int pr[N / 5], p[N];
int t;
void get_primes(int n)
{
p[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!p[i])
{
p[i] = i;
pr[++t] = i;
}
for (int j = 1; j <= t && pr[j] <= n / i; j++)
{
p[i * pr[j]] = pr[j];
if (p[i] == pr[j])
break;
}
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
get_primes(N - 10);
cin >> n;
for (int i = 1, x; i <= n; i++)
{
cin >> x;
for (int j = 1; j <= x / j; j++)
{
if (x % j == 0)
{
cnt[j]++;
if (j != x / j)
cnt[x / j]++;
}
}
}
f[1] = n;
for (int x = 1; x <= N - 10; x++)
{
for (int i = 1; i <= t && pr[i] <= (N - 10) / x; i++)
{
int y = x * pr[i];
f[y] = max(f[y], f[x] + (y - x) * cnt[y]);
}
}
cout << *max_element(f + 1, f + N - 9) << endl;
return 0;
}

Codeforces Round #757 (Div. 2) - D2. Divan and Kostomuksha (hard version)的更多相关文章

  1. Codeforces Round #579 (Div. 3) D2. Remove the Substring (hard version) (思维,贪心)

    题意:给你一个模式串\(t\),现在要在主串\(s\)中删除多个子串,使得得到的\(s\)的子序列依然包含\(t\),问能删除的最长子串长度. 题解:首先,我们不难想到,我们可以选择\(s\)头部到最 ...

  2. Codeforces Round #540 (Div. 3) D2. Coffee and Coursework (Hard Version) (二分,贪心)

    题意:有\(n\)个数,每次可以选\(k(1\le k\le n)\)个数,并且得到\(a_1+max(0,a_2-1)+max(0,a_3-2)+...+max(0,a_k-k+1)\)的贡献,问最 ...

  3. Codeforces Round #350 (Div. 2) D2. Magic Powder - 2

    题目链接: http://codeforces.com/contest/670/problem/D2 题解: 二分答案. #include<iostream> #include<cs ...

  4. Codeforces Round #527 (Div. 3) D2. Great Vova Wall (Version 2) 【思维】

    传送门:http://codeforces.com/contest/1092/problem/D2 D2. Great Vova Wall (Version 2) time limit per tes ...

  5. Codeforces Round #738 (Div. 2) D2题解

    D2. Mocha and Diana (Hard Version) 至于D1,由于范围是1000,我们直接枚举所有的边,看看能不能加上去就行,复杂度是\(O(n^2logn)\).至于\(n\)到了 ...

  6. Codeforces Round #540 (Div. 3)--1118D2 - Coffee and Coursework (Hard Version)

    https://codeforces.com/contest/1118/problem/D2 和easy version的主要区别是,数据增加了. easy version采用的是线性查找,效率低 在 ...

  7. Codeforces Round #350 (Div. 2) D2 二分

    五一期间和然然打的团队赛..那时候用然然的号打一场掉一场...七出四..D1是个数据规模较小的题 写了一个暴力过了 面对数据如此大的D2无可奈何 现在回来看 一下子就知道解法了 二分就可以 二分能做多 ...

  8. Codeforces Round #594 (Div. 1) D2. The World Is Just a Programming Task (Hard Version) 括号序列 思维

    D2. The World Is Just a Programming Task (Hard Version) This is a harder version of the problem. In ...

  9. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 水题

    D2. RGB Substring (hard version) inputstandard input outputstandard output The only difference betwe ...

  10. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 【递推】

    一.题目 D2. RGB Substring (hard version) 二.分析 思路一开始就想的对的,但是,用memset给数组初始化为0超时了!超时了! 然后我按照题解改了个vector初始化 ...

随机推荐

  1. Jmeter 函数助手之__UUID 生成唯一的标识符

    在测试ws协议接口时,常常需要传入唯一标识符,jmeter 提供__UUID.__Random生成随机的字符串,两者区别为:__UUID生成的随机字符串不会重复,而__Random会重复 __UUID ...

  2. vue引入高德地图

    一,下载 npm install vue-amap --save 二,main.js文件内引入 import VueAMap from 'vue-amap' Vue.use(VueAMap); // ...

  3. 解读JVM级别本地缓存Caffeine青出于蓝的要诀3 —— 讲透Caffeine的数据驱逐淘汰机制与用法

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 上一篇文章中,我们聊了下Caffein ...

  4. 【转载】七个人生工具,终生受益 | SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则

    人类历史原本就是一部追求自身平衡的奋斗史,本文介绍七个人生工具:SWOT.PDCA.6W2H.SMART.WBS.时间管理.二八原则 . 1.SWOT分析法 Strengths:优势 Weakness ...

  5. [编程基础] C++多线程入门5-使用互斥锁解决资源竞争

    原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 文章目录 5 使用互 ...

  6. [C++]C++11:Function与Bind

    std::function 它是函数.函数对象.函数指针.和成员函数的包装器,可以容纳任何类型的函数对象,函数指针,引用函数,成员函数的指针. 以统一的方式处理函数.函数对象.函数指针.和成员函数. ...

  7. Spring 和 Spring MVC的区别

    Spring 和 Spring MVC的区别   学习Spring MVC也有几天时间了,那么Spring和Spring MVC的区别到底在哪里,二者是什么关系呢?认为二者是一个东西那肯定是不对的,而 ...

  8. 如何解决github下载很慢的问题?(已经解决)

    目的是为了解决GitHub致命的下载速度慢的问题 方法 通过码云来导入github,通过码云下载 1.在github上面找到自己想要的项目 这一步略过 2.复制github项目上面的网页链接 3.打开 ...

  9. Docker+nginx部署前后端分离项目

    1.下载Docker和Docker-Compose 1.安装Docker 记一次踩坑:误装podman-docker 问题概述:Centos8去下载Docker时,默认装的是podman-docker ...

  10. Redis 异步客户端选型及落地实践

    作者:京东科技 王晨 Redis异步客户端选型及落地实践 可视化服务编排系统是能够通过线上可视化拖拽.配置的方式完成对接口的编排,可在线完成服务的调试.测试,实现业务需求的交付,详细内容可参考:htt ...