数据结构_coprime_sequence(互质序列)
coprime_sequence(互质序列)
问题描述
顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列。比如[1,2,3],
[4,7,8],都是互质序列。 [3,6,9]不是互质序列。现在并不要求你找出一个互质
序列,那样太简单了!真正的问题描述是:给定一个序列,删除其中一个元素使
得剩下元素的 gcd 最大,输出这个 gcd。
★数据输入
输入第一行为一个正整数 n。 第二行为 n 个正整数 ai(1<=ai<=10^9)。
80%的数据 2<=n<=1000.
100%的数据 2<=n<=100000.
★数据输出
输出一个正整数,表示最大的 gcd。
| 输入示例 | 输出示例 |
| 3 1 1 1 |
1 |
| 输入示例 | 输出示例 |
| 5 2 2 2 3 2 |
2 |
| 输入示例 | 输出示例 |
| 4 1 2 4 8 |
2 |
★Hint
最大公因数缩写是 gcd。 gcd(a,b,c)=gcd(a,gcd(b,c)).
解题思路
暴力算法小规模可以,但是复杂度达到O(n^2),大规模数据超时。因此必须采用更好的算法。
期初,我的想法是将从左到右算过的数据存下来,即开一个数组,将第1个数的gcd(本身)存在第1个位置,将第1~2个数的gcd存在第2个位置,1~3个数的gcd存在第3个位置,以此类推。
而其中第1~n个数的gcd可由gcd( 1~(n-1)的gcd , 第n个数 )求得 是递推的过程,复杂度O(n)。
但仅仅这样只比暴力节省一半时间。因此,仿照前面的过程,引入从右到左的gcd计算
开等长数组left[] right[] ,将 从左到右 和 从右到左 的gcd递推计算结果分别存入left[] 与right[]
那么除掉下标为 i 的数,其他数的为gcd( left[i-1] , right[i+1]) 首尾做特殊判断
这样遍历一遍,就能找到gcd_max
code
#include <stdio.h>
#include <stdlib.h> int p[] = {};
int left[] = {};
int right[] = {}; void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
} int Getgcd(int n, int m)
{
if (n < m) swap(n, m);
return n%m == ? m : Getgcd(m, n%m);
} int main()
{
// freopen("test.txt","r",stdin);
int n, i, j;
scanf("%d", &n);
// int *p = (int *)malloc(sizeof(int)*n);
for (i = ; i < n; i++)
scanf("%d", p + i); int gcd = -;
for(i=; i<n; i++) //for(i=0;i<n-1;i++)
{
if(i==)
gcd = p[];
else
gcd = Getgcd(p[i],left[i-]);
left[i] = gcd;
}
for(i=n-; i>=; i--) //for(i=n-1;i>0;i--)
{
if(i==n-)
gcd = p[n-];
else
gcd = Getgcd(p[i],right[i+]);
right[i] = gcd;
} int maxgcd = -;
for(i=; i<n; i++) // except p[i]
{
if(i==)
gcd = right[];
else if(i==n-)
gcd = left[n-];
else
gcd = Getgcd(left[i-],right[i+]);
if(gcd>maxgcd) maxgcd = gcd;
}
printf("%d\n",maxgcd); // free(p);
return ;
}
数据结构_coprime_sequence(互质序列)的更多相关文章
- bzoj 4921: [Lydsy六月月赛]互质序列
4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 188 Solved: 110[Submit][Status ...
- Codeforces 959 树构造 暴力求最小字典序互质序列
A B C 题目给你一个结论 最少需要min((odd,even)个结点可以把一棵树的全部边连起来 要求你输出两颗树 一棵树结论是正确的 另外一棵结论是正确的 正确结论的树很好造 主要是错误的树 题目 ...
- 【bzoj4921】[Lydsy六月月赛]互质序列 暴力
题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...
- BZOJ4921「Lydsy1706月赛」互质序列
吐槽一下BZOJ没有C++11 题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...
- BZOJ4921 互质序列
即求删掉一个子序列的gcd之和.注意到前后缀gcd的变化次数都是log级的,于是暴力枚举前缀gcd和后缀gcd即可. #include<iostream> #include<cstd ...
- [BZOJ 4921][Lydsy1706月赛]互质序列
传送门 因为区间 gcd 的变换不会超过 log 个,所以我们可以暴力枚举区间起点,复杂度是 n*logn 的 #include <bits/stdc++.h> using namespa ...
- 数据结构 elegant_sequence(优雅的序列)
数据结构 elegant_sequence(优雅的序列) 问题描述 如果一个序列的元素的异或和等于 1,我们称这个序列为优雅的序列.现在给你一个 01 序列,和 m 次询问.对于每次询问,给出 l,r ...
- HDU5668 Circle 非互质中国剩余定理
分析:考虑对给定的出圈序列进行一次模拟,对于出圈的人我们显然可以由位置,编号等关系得到一个同余方程 一圈做下来我们就得到了n个同余方程 对每个方程用扩展欧几里得求解,最后找到最小可行解就是答案. 当然 ...
- hdoj1014 互质
Uniform Generator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- 怪盗基德的滑翔翼(还是最长x序列)
//怪盗基德的滑翔翼 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstri ...
- Unity3D研究院之Assetbundle的实战(六十三)
http://www.xuanyusong.com/archives/2405 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院 ...
- Dubbo与Zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- Linux 命令行监视显卡使用情况
本文由Suzzz原创,发布于 http://www.cnblogs.com/Suzzz/p/4106581.html ,转载请保留此声明. 在使用GPU做计算,比如跑 Deep Learning代码的 ...
- 洛谷【P2669】NOIP2015普及组 T1金币
我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P266 ...
- Redis 分布式锁 - 分布式锁的正确实现方式
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- 在阿里云服务器上安装git
https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git 有yum的系统执行下列命令(已测试) $ yum in ...
- Azure VMSS ---- PowerShell创建标准镜像的VMSS集群
VMSS的创建可以采用Portal.Powershell.Azure CLI或者Template. 但目前Portal创建有很多限制,本文将介绍如何用PowerShell来创建VMSS的集群. 具体的 ...
- HTTP-Runoob:HTPP Content-Type
ylbtech-HTTP-Runoob:HTPP Content-Type 1.返回顶部 1. HTTP content-type Content-Type,内容类型,一般是指网页中存在的Conten ...
- xargs 命令使用小记
ls -1|xargs -t -i mv {} noncredit{} 注意: ls -1 是123的1,不是lmn的l