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;
}

最新文章

  1. xpath实例 --//span[contains(.,&#39;资讯管理&#39;)]
  2. linux资源使用配置文件 /etc/security/limits.conf和ulimit
  3. 获取Spring的上下文环境ApplicationContext的方式
  4. win8.1 环境下搭建PHP5.5.6+Apache2.4.7
  5. Codeforces Round #326 (Div. 2) D. Duff in Beach dp
  6. spring + maven +testng 测试常见依赖包问题
  7. Linux on Power 上的调试工具和技术
  8. Mac编程的官方文档(类似MSDN)
  9. 远程推送-----iOS
  10. MSIL实用指南-生成构造函数
  11. pytest学习--快速入门
  12. LOL新版符文 怎么查看队友的符文配置?
  13. 【IT界的厨子】酱香鲈鱼
  14. Kubernetes核心概念总结
  15. 微软BI 之SSRS 系列 - 如何实现报表标签的本地化 - 中文和英文的互换
  16. Dubbo -- 系统学习 笔记 -- 示例 -- 只注册
  17. vs2012旗舰版 有效注册密钥
  18. Sublime Text 3 个人使用总结
  19. \extras\intel\Hardware_Accelerated_Execution_Manager HAXM 未安装导致AndroidStudio新建了模拟器开启不了
  20. personal evolution

热门文章

  1. Django AttributeError: &#39;BugDeserializer&#39; object has no attribute &#39;_meta&#39;
  2. 历时9个月重构iNeuOS工业互联网操作系统,打造工业领域的“Office”
  3. CTFshow——funnyrsa2
  4. GitHub - 电脑经常无法访问GitHub页面
  5. (3)go-micro微服务项目搭建
  6. Isaac Sim 机器人仿真器介绍、安装与 Docker [1]
  7. python之路33 MySQL 1
  8. iOS根据两点经纬度坐标计算指南针方位角
  9. P8881 懂事时理解原神
  10. vulnhub靶场之VULNCMS: 1