Codeforces Round #757 (Div. 2) - D2. Divan and Kostomuksha (hard version)
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)\) 最大
思路
- 设 \(cnt[x]\) 为 \(x\) 的倍数有多少个,easy版本可用调和级数,hard版本可 \(n*\sqrt{a[i]}\) 分解因数 
- 若 \(x\) 开头,最优策略是把 \(x\) 的倍数全都紧接着放在 \(x\) 之后,他们的贡献为 \(cnt[x]*x\) 
- 设以 \(x\) 作为 \(gcd(a[1])\) 的答案为 \(f[x]\)(这里并非 \(a[1]\) 开头 \(gcd(a[1])\) 就是 \(a[1]\), \(a[1]\) 的任何因数都可以), 把 \(x\) 的倍数 \(y\) 放到 \(x\) 的前面时会更优,因此 \(f[x]->f[y]\) 转移 
- 在 \(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])\) 
- 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)的更多相关文章
- Codeforces Round #579 (Div. 3)  D2. Remove the Substring (hard version)  (思维,贪心)
		题意:给你一个模式串\(t\),现在要在主串\(s\)中删除多个子串,使得得到的\(s\)的子序列依然包含\(t\),问能删除的最长子串长度. 题解:首先,我们不难想到,我们可以选择\(s\)头部到最 ... 
- 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)\)的贡献,问最 ... 
- Codeforces Round #350 (Div. 2) D2. Magic Powder - 2
		题目链接: http://codeforces.com/contest/670/problem/D2 题解: 二分答案. #include<iostream> #include<cs ... 
- 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 ... 
- Codeforces Round #738 (Div. 2) D2题解
		D2. Mocha and Diana (Hard Version) 至于D1,由于范围是1000,我们直接枚举所有的边,看看能不能加上去就行,复杂度是\(O(n^2logn)\).至于\(n\)到了 ... 
- Codeforces Round #540 (Div. 3)--1118D2 - Coffee and Coursework (Hard Version)
		https://codeforces.com/contest/1118/problem/D2 和easy version的主要区别是,数据增加了. easy version采用的是线性查找,效率低 在 ... 
- Codeforces Round #350 (Div. 2) D2 二分
		五一期间和然然打的团队赛..那时候用然然的号打一场掉一场...七出四..D1是个数据规模较小的题 写了一个暴力过了 面对数据如此大的D2无可奈何 现在回来看 一下子就知道解法了 二分就可以 二分能做多 ... 
- 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 ... 
- Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 水题
		D2. RGB Substring (hard version) inputstandard input outputstandard output The only difference betwe ... 
- Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 【递推】
		一.题目 D2. RGB Substring (hard version) 二.分析 思路一开始就想的对的,但是,用memset给数组初始化为0超时了!超时了! 然后我按照题解改了个vector初始化 ... 
随机推荐
- 1、debug调试
			Debug断点调试: Debug调试界面图: 利用Debug功能来追踪代码的运行流程,分析与定位异常发生的位置,观察运行中数据的变化. 1.Step Over(F8):进入下一步,如果当前行断点是一个 ... 
- Spark详解(01) - Scala编程语言
			Spark详解(01) - Scala编程语言概述 Scala官网:https://www.scala-lang.org/ 什么是Scala 从英文的角度来讲,Scala并不是一个单词,而是Scala ... 
- 小样本利器5. 半监督集各家所长:MixMatch,MixText,UDA,FixMatch
			在前面的几个章节中,我们介绍了几种基于不同半监督假设的模型优化方案,包括Mean Teacher等一致性正则约束,FGM等对抗训练,min Entropy等最小熵原则,以及Mixup等增强方案.虽然出 ... 
- (10)go-micro微服务发送邮件
			目录 一 获取QQ邮箱Pass 二 安装gomail 三 初始化发送邮件 四 发送注册邮件 五 发送重置密码邮件 六 最后 一 获取QQ邮箱Pass 1.登录QQ邮箱 2.点击设置,点击账户,下拉找到 ... 
- bugku-source-wp详解
			bugku-source-wp详解 F12先看源代码 base64解码 提交flag 发现这个flag是假的 根据提示打开kali直接扫 命令:gobuster dir -u http://114.6 ... 
- angular小练习--手写弹出窗口以及文件上传或者复制粘贴,后读取打印文件内容
			实现代码如下 <page-header> <ng-template> </ng-template> </page-header> <div> ... 
- 动力节点——day08
			什么是集合,有什么用? 数组其实就是一个集合,集合实际上就是一个容器,可以用来容纳其他数据类型 集合为什么说在开发中使用最多? 集合是一个容器,是一个载体,可以一次容纳多个对象,在实际开发中,假设连接 ... 
- Axure 列表左右滑动交互-删除、置顶
			Axure 列表左右滑动交互 左滑:删除.标记 右滑:置顶.回复 拖一个动态面板,命名为[滑动面板],添加三个状态,并分别命名为:正常状态.向左状态.向右状态 添加元件 正常状态 向左状态 将[正常状 ... 
- for循环-while循环
			for循环 循环语句1--for for循环语句格式: for(初始化表达式①; 布尔表达式②; 步进表达式④){ 循环体③ } 执行流程 执行顺序:①②③④>②③④>②③④-②不满足为止 ... 
- 【CTO变形记】驱动力的选择
			前言:每个人做事,都有着各种动机在里面,有时候看似不可理解的行为或者选择,初一看,可能是'认知',其实深层次实际是内在驱动力使然.例如,当一个人找我们问各种问题的时候,我们往往会先问'你的意图'是什么 ... 
