题面

原题链接(CF1627D)

You have an array \(a_1,a_2,…,a_n\) consisting of \(n\) distinct integers. You are allowed to perform the following operation on it:

Choose two elements from the array \(a_i\) and \(a_j\) \((i≠j)\) such that \(gcd(a_i,a_j)\) is not present in the array, and add \(gcd(a_i,a_j)\) to the end of the array. Here \(gcd(x,y)\) denotes greatest common divisor (GCD) of integers \(x\) and \(y\).

Note that the array changes after each operation, and the subsequent operations are performed on the new array.

What is the maximum number of times you can perform the operation on the array?

Input

The first line consists of a single integer \(n\) \((2≤n≤10^6)\).

The second line consists of \(n\) integers \(a_1,a_2,…,a_n (1≤a_i≤10^6)\). All ai are distinct.

Output

Output a single line containing one integer — the maximum number of times the operation can be performed on the given array.

Examples

input

5
4 20 1 25 30

output

3

input

3
6 10 15

output

4

Note

In the first example, one of the ways to perform maximum number of operations on the array is:

Pick \(i=1,j=5\) and add \(gcd(a_1,a_5)=gcd(4,30)=2\) to the array.

Pick \(i=2,j=4\) and add \(gcd(a_2,a_4)=gcd(20,25)=5\) to the array.

Pick \(i=2,j=5\) and add \(gcd(a_2,a_5)=gcd(20,30)=10\) to the array.

It can be proved that there is no way to perform more than 3 operations on the original array.

In the second example one can add 3, then 1, then 5, and 2.

大意

给出一个整数的不可重集合,可以对其重复执行以下操作:对于集合内的任意两个数,计算它们的最大公约数(GCD),如果这个GCD不存在于原集合中,就把它加入这个集合。新加入的数也可以在之后的操作中参与计算。重复此操作,求最多能进行的操作次数。

题解

题面的数据达到了1e6,很显然不能枚举每一对数来检查。但是,集合内的元素大小也在1e6范围内,因此可以开一个大小1e6的数组记录这个数有没有出现过。同时GCD还有一个很有用的性质:两个数的GCD不大于两个数的最小值,也就是\(gcd(a_i,a_j) \leq \min (a_i,a_j)\)。所以,如果一个数能够被加入这个集合,它一定比原集合的最大元素还要小。所以我们考虑对答案进行枚举,从1到这个最大值的所有整数全部判断一遍。

怎么判断这个数能否被加入集合呢?首先,如果已经存在于集合中的数肯定不能被加入,因此可以跳过。然后,对于不在集合中的数\(i\),要想让它被加入集合中,必须存在两个数使其最大公约数为\(i\)。也就是说,集合中存在两个数\(a_p=pi,a_q=qi\),其中\(p,q\)互质。由此,我们可以考虑对每一个没有出现的数\(i\),检查所有的\(2i,3i,\dots ,ki \leq \max(a)\)是否出现在集合中。但是,判断互质是一件非常麻烦的事情。所以联想到GCD的另一个重要性质:三个数的GCD等于其中两个数的GCD和另外一个数的GCD,也就是说\(gcd(a_i,a_j,a_k)=gcd(gcd(a_i,a_j),a_k)\),这个性质对\(n\)个数也成立。假设对所有的\(ki\),有三个数\(k_1i,k_2i,k_3i\)出现在了集合中,其中\(k_n\)两两不互质,但是\(k_1,k_2,k_3\)互质,那么我们可以把\(k_4i=gcd(k_1i,k_2i)\)加入到集合中(如果它已经在集合中那么就不用理睬了),然后计算\(gcd(k_4i,k_3i)=i\),将其加入集合。对于\(n\)个元素也同理。据此,我们可以得出,对于任意一个未出现在集合内的数\(i\),它能加入集合的充要条件是集合内所有\(i\)的倍数的数的GCD等于\(i\)。

枚举每一个可能的\(i\),对每一个\(i\)作判断计算次数为\(\frac{n}{i}\),对此求和(调和级数)得到线性乘以对数的复杂度,求GCD的复杂度大约为对数级别,因此总体复杂度为\(O(n \log ^2 n)\)。

代码如下:

#include <bits/stdc++.h>
#define GRP \
int T; \
cin >> T; \
rep(C, 1, T)
#define FAST \
ios::sync_with_stdio(false); \
cin.tie(0);
using namespace std;
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define rrep(i, a, b) for (int i = a; i >= b; --i)
#define elif else if
#define mem(arr, val) memset(arr, val, sizeof(arr))
typedef long long ll;
typedef unsigned long long ull; int n;
int a[1000010];
bool vis[1000010];
int maxx, cnt, num;
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
} int main()
{
FAST;
cin >> n;
mem(vis, 0);
cnt = 0;
cin >> a[1];
maxx = a[1];
vis[a[1]] = true;
rep(i, 2, n)
{
cin >> a[i];
maxx = max(maxx, a[i]);
vis[a[i]] = true;
}
rep(i, 1, maxx) //进行枚举
{
if (vis[i])
{
continue;
}
num = 0; //令一个数和0的GCD等于该数本身,可以简化代码
for (int j = i * 2; j <= maxx; j += i) //枚举所有的倍数
{
if (!vis[j])
{
continue;
}
num = gcd(num, j);
}
if (num == i)
{
cnt++;
}
}
cout << cnt << endl;
return 0;
}

Not Adding - 题解【数学,枚举】的更多相关文章

  1. 51nod 1943 联通期望 题解【枚举】【二进制】【概率期望】【DP】

    集合统计类期望题目. 题目描述 在一片大海上有 \(n\) 个岛屿,规划建设 \(m\) 座桥,第i座桥的成本为 \(z_i\),但由于海怪的存在,第 \(i\) 座桥有 \(p_i\) 的概率不能建 ...

  2. [题解]数学期望_luogu_P1850_换教室

    数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了, 开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关( ...

  3. bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1779  Solved: 823[Submit][Sta ...

  4. 2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)

    题目链接:http://pat.zju.edu.cn/contests/ds/2-08 一副扑克牌的每张牌表示一个数(J.Q.K分别表示11.12.13,两个司令都表示6).任取4张牌.即得到4个1~ ...

  5. The Golden Age CodeForces - 813B (数学+枚举)

    Unlucky year in Berland is such a year that its number n can be represented as n = xa + yb, where a  ...

  6. Codeforces 813B The Golden Age(数学+枚举)

    题目大意:如果一个数t=x^a+y^b(a,b都是大于等于0的整数)那就是一个unlucky数字.给你x,y,l,r(2 ≤ x, y ≤ 10^18, 1 ≤ l ≤ r ≤ 10^18),求出l到 ...

  7. FZU 2125 简单的等式 【数学/枚举解方程式】

    现在有一个等式如下:x^2+s(x,m)x-n=0.其中s(x,m)表示把x写成m进制时,每个位数相加的和.现在,在给定n,m的情况下,求出满足等式的最小的正整数x.如果不存在,请输出-1. Inpu ...

  8. 【数学+枚举】OpenJ_POJ - C17J Pairs

    https://vjudge.net/contest/171652#problem/J [题意] 问有多少个正整数对(x,y),使得存在正整数p,q满足 1 <= T <= 15 1 &l ...

  9. ZROI17普及23-A.如烟题解--技巧枚举

    题目链接 因版权原因不予提供 分析 别看这是普及模拟赛,其实基本上是提高难度...像这题做NOIpT1的话也说的过去 有个很显然的暴力思路就是枚举c,a,b,时间复杂度\(O(N^3)\), 然后正解 ...

随机推荐

  1. go语言学习入门篇1---go语言的主要特性与发展

    1.1 影响 Go 语言发展的早期编程语言 正如 "21 世纪的 C 语言" 这句话所说,Go 语言并不是凭空而造的,而是和 C++.Java 和 C# 一样属于 C 系.不仅如此 ...

  2. Nextcloud fpm 版在 Dokcer 下安装踩坑

    安装 首先到 https://registry.hub.docker.com/_/nextcloud 获取 Nextcloud 的示例 docker-compose version: '2' volu ...

  3. oracle 跨分区查询效率,Oracle分区表做跨分区查询

    问:有一张大表,其中按时间字段(TIME_ID)进行表分区(按季度分区),但是如果业务人员做跨季度的大批量数据的查询时,未能走TIME_ID分区索引,导致全表扫描.此种情况该如何处理? 示例解析: 1 ...

  4. 什么是ORM思想?常用的基于ORM的框架有哪些?各有什么特点?

    ORM的全称是Object-Relational Mapping,即对象关系映射.ORM思想的提出来源于对象与关系之间相悖的特性.我们很难通过对象的继承与聚合关系来描述数据表中一对一.一对多以及多对多 ...

  5. 什么是 Hystrix 断路器?我们需要它吗?

    由于某些原因,employee-consumer 公开服务会引发异常.在这种情况下使用Hystrix 我们定义了一个回退方法.如果在公开服务中发生异常,则回退方法返回一些默认值. 如果 firstPag ...

  6. String 和 StringBuilder、StringBuffer 的区别?

    Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它 们可以储存和操作字符串.其中 String 是只读字符串,也就意味着 String 引 ...

  7. 爬虫-ip代理

    代理(proxy) 代理服务器:实现请求转发,从而可以实现更换请求的ip地址 代理的匿名度: 透明:服务器知道你使用了代理并且知道你的真实ip 匿名:服务器知道你使用了代理,但是不知道你的真实ip 高 ...

  8. mybatis-02-mapper生成器插件使用

    sb_mybatis <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  9. ECMAScript中有两种属性:数据属性和访问器属性。

    ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们.为了表示特性是内部值,该规范把它们放在了两对儿方括号中,例如 [[Enumerable ...

  10. 微信小程序下拉加载和上拉刷新两种实现方法

    方法一:onPullDownRefresh和onReachBottom方法实现小程序下拉加载和上拉刷新 首先要在json文件里设置window属性 设置js里onPullDownRefresh和onR ...